Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么是;Promise在事件循环的同一回合中触发;什么意思?_Javascript_Node.js_Q - Fatal编程技术网

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

Javascript 什么是;Promise在事件循环的同一回合中触发;什么意思?,javascript,node.js,q,Javascript,Node.js,Q,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 我不明白,我本以为既然第一个被解雇了,我应该先看看第二个 他们解释说,这是因为“承诺

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
处理程序不会运行

这是承诺/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');
您可以确信,
FIRST
将始终首先记录

本手册第2章和第3章详细讨论了这一点。有时异步运行,有时同步运行的异步操作称为Zalgos,它们被认为不是一件好事

需要注意的是,jQuery中广泛使用的承诺并不遵循这种行为,并且也有一个错误。如果您发现自己有一个jQuery承诺,请用适当的承诺将其包装起来,然后继续:

Q($.ajax(...)).then(breatheWithEase);
他们解释说,这是因为“承诺在事件循环的同一回合触发”。我不明白那是什么意思

我也是,我觉得这部分没什么意义。这可能意味着,当您调用
resolve
reject
时,承诺会立即得到解决,并且从那时起不会改变其状态。这与回调无关

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

您可以预期传递给promise的“then”方法的函数将在事件循环的下一轮调用

这就像一条简单的经验法则:
那么
回调总是异步调用的。始终,在每一个适当的承诺执行;这是《公约》规定的


为什么会这样?为了一致性。与您的示例片段不同,您不知道承诺是如何或何时得到解决的——您只是从调用的某个方法中得到了它。它可能已经被解决了,也可能还没有解决。现在调用promise的
then
方法,您可以知道:它将是异步的。您不需要处理那些可能会改变代码含义的情况,它始终是异步的。

这不是重复的>:(.问题不在于事件循环如何工作,而在于承诺是如何实现的。请阅读以下内容:问题包含错误。承诺永远不会在事件循环的同一轮触发-它们总是在随后的一轮触发!文本实际上没有说“承诺在事件循环的同一轮触发。”它说“承诺/A+规范声明承诺不能在创建它们的事件循环的同一个回合上启动它们的解析/拒绝函数。”,尽管“不”是不可能的。是的,我有点期待缺少一个“不”“还有。我只找到并阅读了,不是官方的。真丢脸。看起来npm上的版本也没有更新。它缺少了“不是”。哇!谢谢你的参考书!