我可以依赖已解析的jquery延迟对象的同步特性

时间:2013-01-12 20:01:31

标签: jquery synchronous jquery-deferred

  

请注意:这个问题是为什么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的行为。我的期望是不合理的吗?

我似乎无法找到有关此行为的任何文档,所以我不确定这是否是我可以依赖的行为。

2 个答案:

答案 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)

考虑提升范围