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 使用