什么"承诺在事件循环的同一转中发射"是什么意思?

hba*_*hba 2 javascript node.js q

NodeJS新手.通过承诺教程('promise-it-wont-hurt')我有以下脚本:

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

输出:

FIRST
SECOND
Run Code Online (Sandbox Code Playgroud)

我不明白,我会想到,既然已经解决了,那么我应该先看到第二个.

他们解释说,这是因为"Promise在事件循环的同一转弯时触发".我不明白这意味着什么......

JLR*_*she 9

基本上,重点是promise的then处理程序在当前代码流完成执行并且控制权返回执行环境(在本例中为Node)之前不会运行.

这是Promises/A +兼容承诺的一个重要特征,因为它确保了可预测性.无论承诺是否立即解决:

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

getAPromise().then(console.log);

console.log('FIRST');
Run Code Online (Sandbox Code Playgroud)

或者是否在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');
Run Code Online (Sandbox Code Playgroud)

你可以放心,FIRST它将永远记录下来.

在第2章和第3章中详细讨论了这个问题.你不知道JS - 异步和性能.有时异步运行并且有时同步运行的异步操作称为Zalgos,它们不被认为是一件好事.

值得注意的是,jQuery中广泛使用的promise 遵守这种行为,并且还存在许多其他问题.如果您发现自己有一个jQuery承诺,请将其包装在适当的承诺中并继续:

Q($.ajax(...)).then(breatheWithEase);
Run Code Online (Sandbox Code Playgroud)