javascript - 如何等待在 map 内解决的 promise ?

标签 javascript angular typescript

我有一个要处理的对象列表。该对象被传递给一个 Promise 函数,该函数执行此操作并解析回来。该过程可以是即时的,也可以不是即时的,具体取决于先前缓存的值。如果已经有计算值,它将立即解决。否则,它将计算。现在我遇到的问题是在计算第一个对象的状态之前将下一个对象传递给 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 在循环期间解决,即使 promise 需要一分钟来计算这个实例。同一组的所有人都具有相同的地位。因此,promise 检查是否已经计算了一个组。如果是,则将其退回。否则,它会计算。这就是问题所在。杰西卡1还没说完,其他人就过去了。
    people.map(function(person) {
   // return the promise to array
   this.calculatorService
    .getStatus(person)
    .then(function(res) {
      person.status = res;


    });
});

最佳答案

数组迭代器,如 mapforEach不要使用 promise ,因为他们不知道如何等待结果。使用简单的 for而是循环:

for (let person of people)
  person.status = await this.calculatorService.getStatus(person)

如果你真的想要一种“功能性”的方式(并且避免显式的 async/await),你可以定义一个类似于 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(...)

关于javascript - 如何等待在 map 内解决的 promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59137483/

相关文章:

node.js - 在 NestJS CQRS 配方中处理 "Event Sourcing"的首选方式

javascript - Jquery ScrollTop 为 ID 倍数 + SetTimeout

javascript - 从 Promise 返回完整的数组

angular - Angular 4 中 KendoUI 的替代品

typescript - 在等待来自服务的异步/REST 数据时防止错误呈现到 View - RxJS/Angular2

angularjs - disabled=false 在 typescript 2.1 中不起作用

javascript - 使用 redux saga 时出错,take(patternOrChannel) : argument 8 is not valid channel or a valid pattern

php - 如何在 IE 中使用 AJAX

javascript - 在谷歌浏览器扩展程序中获取 cookie

javascript - Angular UrlResolver 未被自定义提供程序覆盖