【发布时间】:2017-11-09 09:49:08
【问题描述】:
我正在尝试兑现承诺(对每个承诺进行一些休息 API 调用)。根据两个promise的结果,使用第三个函数处理数据。此外,按顺序运行的功能可能会发生变化。所以我以一种动态的方式来构建承诺。
然而,承诺似乎开始时没有前一个结束。这是用于测试相同概念的简化模型。
var funcs = [
() => {
console.log('Task 1 Sart =', new Date());
sleeper(6000, 'Task 1 Resolved');
console.log('Task 1 Return');
},
() => {
console.log('Task 2 Sart=', new Date());
sleeper(5000, 'Task 2 Resolved');
console.log('Task 2 Return');
},
() => {
console.log('Task 3 Start=', new Date());
console.log('Task 2 Return');
}
];
function sleeper(m, msg) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(console.log(msg, new Date()));
}, m);
});
}
function runSequence(functionSequence) {
return functionSequence.reduce((p, func) => {
return p.then(func);
}, Promise.resolve());
}
var v = runSequence(funcs);
结果如下所示 VM128:51 任务 1 Sart = 2017 年 6 月 7 日星期三 13:54:34 GMT-0700 (PDT) VM128:53 任务 1 返回 VM128:56 任务 2 Sart= 2017 年 6 月 7 日星期三 13:54:34 GMT-0700 (PDT) VM128:58 任务 2 返回 VM128:61 任务 3 开始 = 2017 年 6 月 7 日星期三 13:54:34 GMT-0700 (PDT) VM128:62 任务 2 返回 VM238:69 任务 2 已解决 2017 年 6 月 7 日星期三 13:54:39 GMT-0700 (PDT) VM238:69 任务 1 已解决 2017 年 6 月 7 日星期三 13:54:40 GMT-0700 (PDT)
我假设在第一个任务结束之前我看不到第二个任务开始。看起来他们都是按顺序开始的。有什么我错过或完全误解了承诺的运作方式。我试图实现的是完成第一个,然后开始以下操作
【问题讨论】:
-
没有
Promise或funs数组中的函数返回其他值,即return sleeper(6000, 'Task 1 Resolved'); -
好的。我明白你在指出什么。使用返回它会按顺序做一些事情
-
“问题不在于返回值的位置。” 是的。
return来自函数的Promise,否则无法在执行异步过程的匿名函数调用中确定任务已完成。你很接近,虽然sleeper()调用,你已经返回一个Promise,不是从匿名函数调用返回的。另见stackoverflow.com/questions/44380582/…? -
@amaksr 库不是满足要求的必要条件。只有
return,并且可能需要一个链接的.then(),如果第二个console.log()调用预计在Promise从sleeper()调用返回后被调用,如链接的jsfiddle所示。
标签: javascript asynchronous promise synchronization