我正在尝试运行promises(在每个上调用一些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 = Wed Jun 07 2017 13:54:34 GMT-0700(PDT) VM128:53任务1返回 VM128:56任务2 Sart = Wed Jun 07 2017 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)
我认为我看不到第二个任务开始直到第一个任务结束。看起来他们都是按顺序开始的。我错过了什么或者完全误解了承诺是如何运作的。我试图实现的是完成第一个,然后开始
答案 0 :(得分:-2)
根据评论。这是版本的作品。原始代码中缺少简单的返回
var funcs = [
() => {
console.log('Task 1 Sart =', new Date());
return sleeper(7000, 'Task 1 Resolved');
},
() => {
console.log('Task 2 Sart=', new Date());
return sleeper(3000, 'Task 2 Resolved');
},
() => {
console.log('Task 3 Start=', new Date());
console.log('Task 3 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());
}
runSequence(funcs);