4

请注意:这个问题是关于为什么 jQuery 的 promise 实现不遵循 Promises/A+ 规范的要求 2.2.4


我注意到一旦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

我曾期望将回调放在事件队列中(在这种情况下,控制台的输出将是“等待”),以匹配在延迟对象解决之前调用 done 的行为。我的期望不合理吗?

不过,我似乎找不到任何关于这种行为的文档,所以我不确定这是否是我可以依赖的行为。

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 回答