4

注:この質問は、promiseのjQuery実装が要件2.2.4に関してPromises /A+仕様に準拠していない理由に関するものでした。


jQueryの遅延オブジェクトが解決されると、doneへの新しい呼び出しでdoneCallbacksが同期的に呼び出されることに気付きました。

var d = $.Deferred();

d.resolve("Foo Bar!");

var fooBar = "Waiting";

d.done(function(data){fooBar = data; });

console.log(fooBar);//Will output "Foo Bar!" because the doneCallback is called synchronously

延期されたオブジェクトが解決される前に行われた呼び出しの動作と一致するように、コールバックがイベントキューに配置されることを期待していました(この場合、コンソールへの出力は「待機中」でした)。私の期待は無理ですか?

ただし、この動作に関するドキュメントが見つからなかったため、これが信頼できる動作であるかどうかはわかりません。

4

2 に答える 2

3

この動作は、ここに明示的に文書化されています: http://api.jquery.com/jquery.deferred/

オブジェクトが解決済みまたは拒否済みの状態になると、その状態のままになります。コールバックは、解決済みまたは拒否された Deferred に引き続き追加できます — それらはすぐに実行されます。

于 2014-09-04T09:19:39.407 に答える
0

ここで気をつけなければいけないのは「範囲」だと思います。これは、私がここであなたの質問を理解していることを前提としています。「待機中」が設定されていない理由が気になります。

たとえば、次のスニペットがあります。

    var d = $.Deferred();
    d.resolve("Foo Bar!");
    var fooBar = "Waiting";
    d.done(function(data){fooBar = data; });
    console.log(fooBar)

それは何を与えますか?

これで次のようになりました。

    var d = $.Deferred();
    var fooBar = "Waiting";
    d.done(function(data){fooBar = data; });
    console.log(fooBar)
    d.resolve("Foo Bar!");

この:

    var d = $.Deferred();
    d.done(function(data){fooBar = data; });
    d.resolve("Foo Bar!");
    var fooBar = "Waiting";
    console.log(fooBar)

今すぐこれをチェックしてください!

var d = $.Deferred();
console.log( fooBar);
d.resolve("Foo Bar!");
var fooBar = "Waiting";
console.log( fooBar);
d.done(function(data){fooBar = data; });
console.log(fooBar)

巻き上げスコープについて考えてください。

于 2014-09-07T05:54:00.980 に答える