javascript - 如何等待在地图内解决的承诺?
问题描述
我有一个要处理的对象列表。该对象被传递给一个 Promise 函数,该函数执行此操作并解析回来。该过程可以是即时的,也可以不是即时的,具体取决于先前缓存的值。如果已经有计算值,它将立即解决。否则,它将计算。现在我遇到的问题是在计算第一个对象的状态之前将下一个对象传递给承诺:
let people = [
{groupId: 1, name: 'Jessica Coleman', status: 'Unknown', id:1}
{groupId: 1, name: 'Eric Tomson', status: 'Unknown', id:2}
{groupId: 1, name: 'Samuel Bell', status: 'Unknown', id:3}
];
现在我想绝对等待承诺在循环期间解决,即使承诺需要一分钟来计算这个实例。同一组的所有人都具有相同的地位。因此,promise 检查是否已经计算了一个组。如果是,则将其退回。否则,它会计算。这就是问题所在。杰西卡1还没说完,其他人就过去了。
people.map(function(person) {
// return the promise to array
this.calculatorService
.getStatus(person)
.then(function(res) {
person.status = res;
});
});
解决方案
数组迭代器喜欢map
或forEach
不使用 Promise,因为它们不知道如何等待结果。改用一个简单的for
循环:
for (let person of people)
person.status = await this.calculatorService.getStatus(person)
如果您真的想要一种“功能性”方式(并避免显式异步/等待),您可以定义一个类似于 bluebird 的函数Promise.each
:
Promise.each = function(ary, fn) {
return ary.reduce((p, x) => p.then(() => fn(x)), Promise.resolve(null))
}
并像这样应用它:
function setStatus(person) {
return calculatorService
.getStatus(person)
.then(res => person.status = res);
}
Promise.each(people, setStatus).then(...)
推荐阅读
- python - 如何使用 Tensorflow 检查我的 ML 训练代码是否正确?
- blender - 将原点设置为几何移动对象
- php - 我的 elseif 语句仅适用于第一个语句
- python - 如何将文件移动到另一个目录 django-storage s3
- django - Why is Model.objects.filter returning an empty query?
- java - Java 中的锯齿状数组和嵌套 For 循环
- java - 迄今为止的确切字符串并保持原始格式
- python - 鱼:未知命令:使用自定义 python 命令时 uname
- wpf - 当我将一组 DependencyProperties 封装到一个 DependencyObject 中时,属性更改会自动转发到 UserControl 吗?
- python - 使用 Graphql 和 Channels 包的 Django 应用程序在应用程序内抛出异常:“NoneType”对象没有属性“替换”