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在事件循环的同一个转弯处开火"。我不明白这意味着什么。。。
基本上,关键是promise的then
处理程序在当前代码流完成执行并将控制返回到执行环境(在本例中为Node)之前不会运行。
这是承诺/A+合规承诺的一个重要特征,因为它确保了可预测性。无论承诺是否立即解决:
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');
可以保证CCD_ 2将始终首先被记录。
这在的第2章和第3章中有详细的讨论;性能。有时异步运行,有时候同步运行的异步操作被称为Zalgos,它们被认为不是一件好事。
需要注意的是,jQuery中广泛使用的promise不遵守这种行为,还存在许多其他问题。如果你发现自己有一个jQuery承诺,用一个合适的承诺来包装它,然后继续:
Q($.ajax(...)).then(breatheWithEase);
他们解释说,之所以会发生这种情况,是因为"Promise在事件循环的同一个转弯处启动"。我不明白这意味着什么。。。
我也是,我觉得这部分没什么意义。这可能意味着,当您调用resolve
或reject
时,promise会立即得到解决,从此不会改变其状态。这与回调无关。
更重要的是要理解该段中的下一句话:
您可以预期传递给promise的"then"方法的函数将在事件循环的NEXT循环中被调用
这就像一条简单的经验法则:then
回调总是异步调用。始终,在每一个恰当的承诺执行中;这是Promises/A+规范规定的。
为什么会这样?为了一致性。与您的示例片段不同,您不知道如何或何时解决promise——您只是从您调用的某个方法返回它。它可能已经得到解决,也可能仍然悬而未决。现在您调用promise的then
方法,就可以知道:它将是异步的。您不需要处理可能是同步的或不是同步的情况,也不需要更改代码的含义,它总是异步的。