javascript - 将异步函数传递给 promise.all()
问题描述
我知道promise.all()
期待一系列的承诺。
但是,是否可以执行以下操作?如果不是,请提出解决方法。
不建议使用await
内for
循环。这就是为什么我要推入一个数组并这样做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
接受一组promises,而不是一组函数——你当前的代码将无法工作。
主要问题是您只是有条件地使用异步操作的结果。您可以链接.then
到 Promise 以使 Promise 解析为 的结果.then
,而不是其初始解析值。那是:
Promise.resolve(2)
.then(res => res + 4)
产生一个解析为 6 的 Promise。
使用此逻辑,您可以将 Promise 推送到数组中,该数组在其中then
有条件地使用结果 ( distances = response.data...
) 并返回最终值,或者不返回任何内容。最后,调用Promise.all
Promises 数组,并按布尔值过滤:
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
推荐阅读
- winforms - 检查应用程序是否允许通知
- python - 如何将类型的 `__init__` 或 `__new__` 绑定到其他类实例?
- mysql - Windows 机器上的 MySQL Server 8.0,阻止名称解析
- java - 优先队列
> 不接受来自我的地图的条目对象 - javascript - 尝试从 JSON 追加获取数据
- c# - C#中的石头、纸、剪刀
- java - 未解决的要求:导入包:com.google.common.base
- python-3.x - GetObject 操作:尝试使用 boto 读取 S3 存储桶中的文件时拒绝访问
- python - 没有线程的 Python 计时器
- amazon-web-services - 为什么我不应该将我的所有 DynamoDB 项目都放在同一个分区键值中?