2010-12-28 8 views
1

イメージ要素を作成し、イメージ属性をチェックしてからtrue/falseを返す単純なテストを作成しようとしています。問題は、onloadイベントを使用するとテストが非同期になることです。それは自分自身では問題ではありません(私は以下のコードで簡単にコールバックを使用しています)が、私が理解できないのは、ブール値を返す単一の関数にこれをカプセル化する方法です。非同期イベントとそのコールバックをブール値を返す関数にラップすることはできますか?

私は、クロージャ、再帰、および自己実行機能のさまざまな組み合わせを試みましたが、運がなかった。

質問:私は高密度で単純なものを見落としているのですか、実際にはこれは実際には不可能です。なぜなら、私はまだ同期的な期待で非同期関数をラップしようとしているからです。

は、ここでは、コードです:

if (supportsImage) { 
    //Do some crazy stuff 
} 

ありがとう:私が欲しいものを、明確にするため

var supportsImage = function(callback) { 
    var img = new Image(); 
    img.onload = function() { 
    //Check attributes and pass true or false to callback 
    callback(true); 
    }; 
    img.src = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='; 
}; 

supportsImage(function(status){ 
    console.log(status); 
}); 

それは次のように使用することができるような何かでこれをラップすることができることです!

(ところで、私は、非同期対同期についての混乱に関するSOの質問のトンがある知って謝罪これは以前答えたものに減少させることができる場合。。)

答えて

2

いいえ、あなたの「クレイジーなもの」をsupportsImageに渡すことができます。

supportsImage(function(result){ 
    if(result) { 
     //Do some crazy stuff 
    } 
}); 
+0

ありがとうございます。コールバックの中にある「ものをすること」は、私が現在やっていることですが、コールバックに渡された結果を分離する方法があるかどうか不思議でした。私はそれが可能だとは思わなかったが、それを受け入れる前に尋ねたいと思った。 =) –

2

短い答え:いいえ、あなたはできませんが.. ..

+0

私の短い答えはとても短かったので、私はそれ:-) – Pointy

+0

@Pointyを投稿することはできないだろう:私はいくつかのより多くのドットを追加しなければならなかった理由です:私は** ** 'NO D –

+0

見てきました'前に答えて。ポスターは最初に長い答えを書いた後、短い答えにそれを編集することであると教えてくれました。これは、stackoverflowのように見えるだけではなく、編集を送信します。 – slebetman

1

"Do some crazy stuff"がコールバック内にあるようにコードを設計するのはなぜですか? これは、コールバックが動作する方法です。あなたはまだ同期的に考えようとしています。

var supportsImage = function(callback) { 
    var img = new Image(); 
    img.onload = function() { 
    //Check attributes and invoke callback if true 
    callback(); 
    }; 
    img.src = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='; 
}; 

supportsImage(function() { 
    // Do some crazy stuff 
}); 
+0

ええ、それは私が今やっていることです。それは動作しますが、私が興味を持っているのは、 "簡単なことですが"クレイジーなことをするのではなく、同期的にアクセスできる方法でコールバックの結果を保存することです...私が考えたように、 。ありがとう。 –

関連する問題