什么是“;Promise在事件循环的同一个循环上点火“;意思是

What does "Promise fires on the same turn of the event loop" mean?

本文关键字:循环 意思是 同一个 事件 Promise 什么      更新时间:2024-06-28

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在事件循环的同一个转弯处启动"。我不明白这意味着什么。。。

我也是,我觉得这部分没什么意义。这可能意味着,当您调用resolvereject时,promise会立即得到解决,从此不会改变其状态。这与回调无关。

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

您可以预期传递给promise的"then"方法的函数将在事件循环的NEXT循环中被调用

这就像一条简单的经验法则:then回调总是异步调用。始终,在每一个恰当的承诺执行中;这是Promises/A+规范规定的。

为什么会这样?为了一致性。与您的示例片段不同,您不知道如何或何时解决promise——您只是从您调用的某个方法返回它。它可能已经得到解决,也可能仍然悬而未决。现在您调用promise的then方法,就可以知道:它将是异步的。您不需要处理可能是同步的或不是同步的情况,也不需要更改代码的含义,它总是异步的。