【发布时间】:2017-02-06 20:17:23
【问题描述】:
我一直在使用 Promises,并且我将以下代码组合在一起,这些代码的行为并不像我期望的那样。您可以在此处的 Fiddle 中运行它:
https://fiddle.sencha.com/#view/editor&fiddle/1pmk
function log(txt) {
var lapsed = new Date().getTime() - START;
console.log(lapsed, txt);
}
START = new Date().getTime();
var promise = new Promise(function promiseExecutor(resolve, reject) {
log('in Promise 1 Executor');
setTimeout(function onSetTimeout() {
log('in Promise 1 Timeout');
resolve(123);
}, 500);
});
var promise2 = new Promise(function promise2Executor(resolve, reject) {
log('in Promise 2 Executor');
setTimeout(function onSetTimeout() {
log('in Promise 2 Timeout');
resolve(123);
}, 1000);
});
// sequence
promise
.then(promise2)
.then(function onPromiseDone(p) {
// TODO: why this executes before promise2 resolve?
log('ALL Promise Done! ' + p);
});
如果您查看控制台,您会注意到“ALL Promise Done”消息在第一个承诺被解决后立即触发,然后半秒后第二个承诺被解决......
最终的 then(onPromiseDone) 怎么可能在没有 resolve() 的情况下被触发?
现在,我了解到 Promise 执行器功能立即开始运行,这不是“排序”的好例子。我可以通过将我的承诺包装在“延迟”函数中来实现正确的行为,如下所示:
https://fiddle.sencha.com/#view/editor&fiddle/1pml
不过,这并不能回答我对原始小提琴的问题,我将重复一遍:
最终的 then(onPromiseDone) 怎么可能在没有 resolve() 的情况下被触发?
谢谢!
【问题讨论】:
-
请注意,promise1 和 promise2 都是背靠背启动的,没有涉及到任何顺序。您还不如使用 Promise.all
-
你好像在找
Promise.all([promise, promise2]).then(onPromiseDone) -
1) 我在帖子中讨论了“背靠背”场景;这如何原谅最终 onPromiseDone() 在没有 resolve() 的情况下触发?
-
@IvanJouikov 你没有给 .then 一个回调来打电话......所以它只是继续。由于 promise1 已解决,第二个调用它的回调。
-
@IvanJouikov,如果
then的参数不是函数,那就像noop 一样好。
标签: javascript promise