Promise.All 函数调用问题

Posted

技术标签:

【中文标题】Promise.All 函数调用问题【英文标题】:Promise.All function invocation issue 【发布时间】:2018-05-24 16:56:38 【问题描述】:

我正在使用 Promise.all 函数同时解决多个承诺。请参阅下面的代码 -

function check1() 
  console.log('check 1 invoked') 
  return new Promise((resolve, reject) => 
    setTimeout(()=> resolve('check1'), 4000);
  ) 


function check2() 
  console.log('check2 invoked')
  return new Promise((resolve, reject) => 
    setTimeout(()=> resolve('check2'), 4000);
  ) 


var arr = [check1(), check2()];

Promise.all(arr)
 .then((response) => console.log('response======>',response))
 .catch((error) => console.error('error',error))

上述方法的问题在于,当我创建 promise 数组时,会调用相应的函数。我想以两个函数仅从 promise.all 函数调用的方式更改上述代码。

注意 - 需要将 promise 函数存储在数组中。就像我在做 var arr 一样。

【问题讨论】:

arr = [ check1, check2 ]; Promise.all( arr.map( a => a() ).then ... ? check1() 调用 check1 函数。那不是你想要的。你想要一个函数的reference,这样promise 可以稍后调用它。你可以通过简单地省略()来得到它。 【参考方案1】:

这样就可以了,不要做一个promise数组而是一个functions数组,然后把functions映射到promises:

function check1() 
  console.log('check 1 invoked') 
  return new Promise((resolve, reject) => 
    setTimeout(()=> resolve('check1'), 4000);
  ) 


function check2() 
  console.log('check2 invoked')
  return new Promise((resolve, reject) => 
    setTimeout(()=> resolve('check2'), 4000);
  ) 

//do not store the promises, store the funciton that creates a promise
var arr = [check1, check2];

Promise.all(
  //map functions to promises
  arr.map(fn=>fn())
)
.then((response) => console.log('response======>',response))
.catch((error) => console.error('error',error))

【讨论】:

感谢您的回答。【参考方案2】:

你也可以这样做——

 var check1 = new Promise((resolve, reject) =>  
      setTimeout(()=> resolve('check1'), 4000);
    ); 
    var check2 = new Promise((resolve, reject) =>  
       setTimeout(()=> resolve('check2'), 4000);
    );
    Promise.all([check1, check2]).then(values =>  
      console.log(values);
    , reason => 
      console.log(reason)
    );

【讨论】:

以上是关于Promise.All 函数调用问题的主要内容,如果未能解决你的问题,请参考以下文章

promise,async await,try catch的问题整理

为啥我的 apolloFetch 调用在从 promise.all 中调用时返回一个空查询?

为啥在 Promise.all() 之后不调用 onRejected,其中包含在数组中的 Promise.reject() 传递给 Promise.all()?

[万字详解]JavaScript 中的异步模式及 Promise 使用

Promise的链式调用三种写法,Promise.all与式调用

如何用 Promise.all 替换多个 async/await 调用?