如何解决如何使用Javascript中的不同参数等待同一函数的多次调用
如何用Javascript中的不同参数等待同一函数的多次调用?
我知道Promise.All([func1,func2,func 3 ...])
,但是我实际上是从“ for循环”调用函数getRecipes(ingredients)
,每次都将不同的“成分”传递到getRecipes()
中。我无法将[getRecipes,getRecipes,getRecipes]
的数组传递到Promise.All()
中,因为每次都需要传递不同的参数。
那么我应该如何等待所有getRecipes()
结果返回,然后在所有结果完成后再进行处理?我不知道getRecipes
请求的数量,因为它是基于“ for循环”动态调用的。
示例代码:`
const newAnnotatedList = []
const ingredientList = []
for(var i = 0; i < listOfPictures.length; i++) {
const ingredients = runClarifai(listOfPictures[i].uri)
ingredientList.push(ingredients)
}
console.log('Starting to wait')
Promise.all(ingredientList).then((result) => console.log('Done Waiting'));
for(var i = 0; i < listOfPictures.length; i++) {
const ingredients = ingredientList[i]
// ingredientList.push(ingredients)
newAnnotatedList.push({id:listOfPictures[i].id,uri:listOfPictures[i].uri,ingredients: ingredients})
}
`
例如,当我console.log(ingredientsList[0])
时,我没有返回promise的值(成分字符串数组),而是:
Promise {
"_40": 1,"_55": null,"_65": 0,"_72": Handler {
"onFulfilled": [Function anonymous],"onRejected": [Function anonymous],"promise": Promise {
"_40": 0,"_72": null,},}
解决方法
类似您想要做的事情的声音首先要遍历,但需要多次调用getRecipes
,然后将返回的Promises存储在数组中。只有在完成循环遍历,进行所有必需的调用并将它们推入数组之后,您才将该数组传递给Promise.all()
:
function getRecipes(i) {
return new Promise((resolve,reject) => {
const timeout = Math.floor(Math.random() * 1500);
setTimeout(() => resolve(i),timeout);
});
}
function callGetRecipesLoop() {
const randNum = Math.floor(Math.random() * 10);
console.log(randNum + ' results expected');
const promisesArray = [];
for (let i = 0; i < randNum; i++) {
promisesArray.push(getRecipes(i));
}
Promise.all(promisesArray).then((result) => console.log(result));
}
callGetRecipesLoop();
,
尝试使用async
await
获取干净的代码,如果我们指望.then
会编译这种情况
您的问题在这里Promise.all(ingredientList).then((result) => console.log('Done Waiting'));
result
中的 then
具有您的值
解决方案:
const test = async() => {
const arrayOfResult = await Promise.all(ingredientsList.map(ingredient => getrecipies(ingredient)))
console.log(arrayOfResult) // [promise1_result,promise2_result,...]
}
test()
希望您现在有个清楚的主意。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。