gpt4 book ai didi

javascript - 将异步函数传递给 promise.all()

转载 作者:行者123 更新时间:2023-12-05 02:55:20 25 4
gpt4 key购买 nike

我知道 promise.all() 需要一组 promise 。

但是,有可能做下面这样的事情吗?如果否,请提出解决方法。

不建议在 for 循环中使用 await。这就是为什么我要插入一个数组并对其执行 promise.all() 的原因。

var functionArray = [];
for (let i = 0; i < jobs.length; i += 1) {
...
if (params.origins !== '' && params.destinations !== '') {
functionArray.push(async function() {
response = await getDistance(params.origins, params.destinations);
if (response.error) {
// handle error
return null
} else {
distances = response.data.rows[0].elements.map((el, index) => {
el.emp_id = empIdOrder[index];
return el;
});
sortedDistances = sortDistance(distances);
return formatDataForInsert(jobs[i].job_id, sortedDistances);
}
});
}
}
var dataToBeinserted = await Promise.all(functionArray); // return an array with results

它没有按预期工作。

await Promise.all(functionArray); 始终返回 [ [AsyncFunction], [AsyncFunction] ]

不是应该改为解决吗?

最佳答案

第一个问题是 Promise.all 接受一个 promise 数组,而不是一个函数数组——您当前的代码将无法工作。

主要问题是您只是有条件地使用异步操作的结果。您可以将 .then 链接到 Promise 上,以使 Promise 解析为 .then 的结果,而不是其初始解析值。即:

Promise.resolve(2)
.then(res => res + 4)

导致解析为 6 的 Promise。

使用此逻辑,您可以将 Promise 推送到数组,该数组在其 then 中有条件地处理结果 (distances = response.data...)并返回最终值,不返回任何内容。最后,在 Promise 数组上调用 Promise.all,并通过 bool 值进行过滤:

const promises = [];
for (let i = 0; i < jobs.length; i += 1) {
if (params.origins !== '' && params.destinations !== '') {
promises.push(
getDistance(params.origins, params.destinations)
.then((response) => {
if (response.error) {
// handle error
return null
} else {
const distances = response.data.rows[0].elements.map((el, index) => {
el.emp_id = empIdOrder[index];
return el;
});
const sortedDistances = sortDistance(distances);
return formatDataForInsert(jobs[i].job_id, sortedDistances);
}
})
);
}
}
const results = await Promise.all(promises)
.filter(Boolean); // filter out failures

var dataToBeinserted = await Promise.all(functionArray); // return an array with results

关于javascript - 将异步函数传递给 promise.all(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61337600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com