“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);
他们解释说,这是因为“ 承诺在事件循环的同一回合发生 ”。 我不明白这是什么意思
我也没有,这部分没有多大意义。 这可能意味着,当你致电resolve
或reject
,承诺立即解决,从此不会改变其状态。 这与callback没有任何关系。
更重要的是要理解该段的下一句话:
您可以期望传递给promise的“then”方法的函数将在事件循环的下一个回合中被调用。
这就像一个简单的经验法则: then
callback总是asynchronous调用。 总是在每一个适当的承诺实施; 这是Promises / A +规范的要求 。
为什么是这样? 为了一致。 与您的示例代码片段不同,您不知道承诺如何或何时解决,您只需从您调用的某个方法中将其交还。 它可能已经被解决,或者它可能还在等待中。 现在你调用promise的方法,你可以知道:它将是asynchronous的。 您不需要处理可能是同步的情况,也不需要改变代码的含义,它总是asynchronous的。