条件
first two async functions start at the same time
don't know which one finish first
需要在完成这两项功能时执行第三项功能。
尝试使用诺言。 如果可能的话,请使用承诺和其他方式帮助实现它。
我试图不确定它是否正确......
function foop(a){
return new Promise(function(resolve, reject){
window.setTimeout(function(){
console.log("first promise executed");
}, 2000);
window.setTimeout(function(){
console.log("second promise executed");
if(a>5) resolve(a+10);
}, 2000);
if(a<5) reject("error");
});
}
foop(12).then(function(val){
window.setTimeout(function(){
console.log("first then executed -"+ val);
}, 1000);
}).then(function(val){
window.setTimeout(function(){
console.log("second then executed -"+ val);
}, 500);
}).catch(function(err){
console.log("error occured");
});
预期输出订单
first promise executed //or second promise executed
second promise executed // or first promise executed
first then executed -22 //only executed after first two async completes in any order
second then executed -22 // execute after the third async completes (first then completes)
error occured // in case of reject
答案 0 :(得分:2)
使用Promise.all
:
console.log('starting...');
// example function: sleep for 'delay' ms then resolve to 'value'
const wait = (delay, value) => new Promise((resolve, reject) => setTimeout(() => { console.log('done:', value); resolve(value); }, delay));
// start two async functions at the same time
// (in this case, they complete in random order)
const firstPromise = wait(900 + 200 * Math.random(), 'first');
const secondPromise = wait(900 + 200 * Math.random(), 'second');
// Promise.all will wait until all promises given are resolved:
Promise.all([ firstPromise, secondPromise ])
.then((results) => {
// if all promises are resolved, results is an array of the
// result values from each, in the order they are given
console.log(results); // = [ 'first', 'second' ]
// run some other function again...
return wait(500, 'third');
})
.then((result) => {
// 'result' is the result from the third function
// more functions, etc...
return wait(800, 'fourth');
})
.then((result) => {
// you can even use Promise.all again to run two functions simultatenously, inside a .then
return Promise.all([
wait(1100, 'fifth'),
wait(900, 'sixth')
]);
})
// etc...
.catch((error) => {
// if any promise fail, error will be the error from the first to fail
console.error('Error:', error);
});