以下代码块在Node和浏览器中执行的结果不同。当然,不同的环境,不同的处理时间,以及存在竞态条件。但根据我对Promises的理解,这段代码应该在不同环境下保持一致。
我期望的是Chrome / 浏览器的结果。我不希望看到NodeJs的结果。我不明白为什么每个newPromise的then链在masterPromise的then链继续之前没有完成。换句话说,因为一个新的Promise在then fn中返回到masterPromise promise-chain中,我希望新的Promise的then-chain在masterPromise promise-chain恢复之前完成。
如果有人能指出以下实现中的问题,并解释为什么NodeJs的结果是有效的,那就太好了!
使用chrome 44 and node 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)
Chrome:
registered 1
registered 1 (verbatim, syncronous echo)
registered 2
registered 2 (verbatim, syncronous echo)
registered 3
registered 3 (verbatim, syncronous echo)