“Promise在事件循环的同一回合中触发”是什么意思?

新的NodeJS。 阅读promise教程('promise-it-wont-hurt')我有以下脚本:

var Q = require('q'); var deferred = Q.defer(); deffered.resolve('SECOND'); deffered.promise.then(console.log); console.log('FIRST'); 

输出:

 FIRST SECOND 

我不明白,我会认为,既然解决了先解决,我应该先看看第二。

他们解释说,这是因为“承诺在事件循环的同一回合发生”。 我不明白这是什么意思

基本上,关键是promise的then处理器在当前代码stream完成执行之前不会运行,并且控制权返回到执行环境(在这种情况下是Node)。

这是Promises / A +标准承诺的一个重要特征,因为它确保了可预测性。 不pipe这个承诺是否立即解决:

 function getAPromise() { var Q = require('q'); var deferred = Q.defer(); deferred.resolve('SECOND'); return deferred.promise; } getAPromise().then(console.log); console.log('FIRST'); 

或者是否在10秒后解决:

 function getAPromise() { var Q = require('q'); var deferred = Q.defer(); setTimeout(function () { deferred.resolve('SECOND'); }, 10000); return deferred.promise; } getAPromise().then(console.log); console.log('FIRST'); 

您可以放心, FIRST将始终先login。

这在第二章和第三章中将会详细讨论。 你不知道JS–asynchronous和性能有时asynchronous运行并且有时同步运行的asynchronous操作称为Zalgos,它们不被认为是一件好事。

需要注意的是,jQuery中广泛使用的承诺遵守这一行为,并且还有其他许多问题 。 如果你发现自己有一个jQuery的承诺,把它包装在一个合适的承诺,并继续:

 Q($.ajax(...)).then(breatheWithEase); 

他们解释说,这是因为“ 承诺在事件循环的同一回合发生 ”。 我不明白这是什么意思

我也没有,这部分没有多大意义。 这可能意味着,当你致电resolvereject ,承诺立即解决,从此不会改变其状态。 这与callback没有任何关系。

更重要的是要理解该段的下一句话:

您可以期望传递给promise的“then”方法的函数将在事件循环的下一个回合中被调用。

这就像一个简单的经验法则: thencallback总是asynchronous调用。 总是在每一个适当的承诺实施; 这是Promises / A +规范的要求 。

为什么是这样? 为了一致。 与您的示例代码片段不同,您不知道承诺如何或何时解决,您只需从您调用的某个方法中将其交还。 它可能已经被解决,或者它可能还在等待中。 现在你调用promise的方法,你可以知道:它将是asynchronous的。 您不需要处理可能是同步的情况,也不需要改变代码的含义,它总是asynchronous的。