jQuery site示例中的评论说:
var div = $( "<div>" );
div.promise().done(function( arg1 ) {
// Will fire right away and alert "true"
alert( this === div && arg1 === div );
});
但那不完全正确,是吗?它会快速弹出一个警告框,你会认为它立即被激活,但实际上,下一行代码将被执行,然后每当承诺完成时,它会弹出警报框,对吗?
答案 0 :(得分:4)
您正在查看的示例在上面的标题中说明了这一点:
在没有活动动画的集合上使用.promise()会返回a 解决了承诺:
他们试图证明这会立即返回已解决的承诺
答案 1 :(得分:1)
这是jQuery promises独有的另一个东西,正确的promises实现确定性执行顺序是有保证的。
是的,它会立即同步射击*。这意味着像缓存这样的常见模式需要额外注意,以确保代码不受基本随机执行顺序的影响。
例如,以下代码无法使用,因为结果是随机的:
console.log(1);
//uses ajax first then further requests are cached for 5-10 minutes:
getData().then(function(data) {
console.log(3);
});
console.log(2);
这也意味着当许多promises按顺序使用时,jQuery promises容易受到堆栈溢出的影响。
*这也没有任何好处,使用MutationObserver和trampoline等轻量级调度程序可以有效避免stackoverflow和non-determinism。