在js中执行前两个后需要执行第三个异步函数吗?

时间:2016-08-26 16:47:58

标签: javascript asynchronous promise

条件

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

1 个答案:

答案 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);
  });