请注意:这个问题是为什么promise的jQuery实现不遵循关于requirement 2.2.4的Promises / A +规范。
我注意到,一旦解决了jQuery deferred object,对done的新调用将同步调用任何doneCallback。
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的行为。我的期望是不合理的吗?
我似乎无法找到有关此行为的任何文档,所以我不确定这是否是我可以依赖的行为。
答案 0 :(得分:3)
此行为在此处明确记录:http://api.jquery.com/jquery.deferred/
一旦对象进入已解决或被拒绝状态,它就会保持该状态。回调仍然可以添加到已解决或被拒绝的延期 - 它们将立即执行。
答案 1 :(得分:0)
我认为你需要关注的问题是"范围"。 这是假设我在这里理解你的问题。你好奇为什么" Waiting"没有被设定,因为看起来似乎是在你的决心之后。
例如..你在这里有这个片段:
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)
考虑提升和范围。