【发布时间】:2015-10-23 17:38:40
【问题描述】:
以下代码块在 Node 和浏览器之间的执行方式不同。当然,存在不同的环境、不同的处理时间和竞争条件的可能性。但是根据我对 Promises 的理解,这段代码在环境之间应该是一致的。
我期待 Chrome/浏览器的结果。我不期望 NodeJs 的结果。我不明白为什么每个newPromise 的then 链都没有完成之前masterPromise 的then 链继续。换句话说,因为一个新的 Promise 在一个 then fn 中返回到 masterPromise 承诺链,我希望新的 Promise 的 then 链在 masterPromise 承诺链恢复之前完成。
如果有人可以在以下实现中戳一个洞,并解释为什么 NodeJs 结果是有效的,我会很高兴!
使用 chrome 44 和节点 12.6。
例如:
'use strict';
var masterPromise = Promise.resolve();
var numbers = [ 1, 2, 3 ];
// function returns a new promise that fulfills in 100ms
// it logs two bits of information--one pre-resolve, & one post-resolve.
// because a `.then` is registered immediately, before the promised is
// fulfilled, i would expect the post-resolve console.log to be logged before
// any other logging
var returnNewPromise = function(number) {
var resolve;
var newPromise = new Promise(function(r) { resolve = r; });
newPromise.then(function() { console.log('registered ' + number + ' (verbatim, syncronous echo)'); });
setTimeout(function() {
console.log('registered ' + number);
resolve();
}, 100);
return newPromise;
};
numbers.forEach(function(number) {
var getChildPromise = function(number) {
return returnNewPromise(number);
};
return masterPromise.then(function() {
return getChildPromise(number);
});
});
节点:
registered 1
registered 2
registered 3
registered 1 (verbatim, syncronous echo)
registered 2 (verbatim, syncronous echo)
registered 3 (verbatim, syncronous echo)
铬:
registered 1
registered 1 (verbatim, syncronous echo)
registered 2
registered 2 (verbatim, syncronous echo)
registered 3
registered 3 (verbatim, syncronous echo)
【问题讨论】:
-
您需要详细说明为什么“根据您对 Promise 的理解”,应该预期一种或另一种行为。我认为这是不确定的,两种模式中的任何一种都是相关规范下的有效行为。
-
@Pointy,够公平的!更新
-
@Pointy,我再次更新以真正获得更窄的焦点。是什么在句法上引起了不确定性,你看到了吗?一位同事研究了这个问题,并认为它也应该是确定性的。然而,他遇到了和我一样的问题,尽管他拼凑了一个很棒的小提琴来证明这个问题! jsfiddle.net/kgwouxg7/1
-
这不是语法问题,而是语义问题。我认为它绝对没有理由是确定性的。不同的事件组相互之间没有依赖关系,因此调用顺序应该完全没有区别。
标签: javascript node.js google-chrome promise