3

jQuery 网站上的示例中的评论说:

var div = $( "<div>" );

div.promise().done(function( arg1 ) {
  // Will fire right away and alert "true"
  alert( this === div && arg1 === div );
});

但这并不完全正确,不是吗?它会很快弹出一个警告框,以至于您会认为它立即触发了,但实际上,下一行代码将被执行,然后每当 promise 完成时,它就会弹出警告框,对吗?

4

2 回答 2

4

您正在查看的示例在上面的标题中说明了这一点:

在没有活动动画的集合上使用 .promise() 会返回已解决的 Promise:

他们试图证明这会立即返回一个已解决的承诺

于 2013-11-11T20:35:13.837 回答
1

这是 jQuery Promise 独有的另一件事,保证了正确的 Promise 实现确定性的执行顺序。

所以是的,它会立即同步触发*。这意味着缓存等常见模式需要额外注意以确保代码不受本质上随机执行顺序的影响。

例如以下代码不能使用,因为结果是随机的:

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);

这也意味着当大量的 promise 被顺序使用时,jQuery 的 promise 很容易发生栈溢出。

*这也没有任何好处,可以通过使用 MutationObserver 和 trampoline 等轻量级调度程序有效地避免 stackoverflow 和不确定性。

于 2013-11-12T06:59:31.300 回答