首页 > 解决方案 > promise all 将结果转化为对象

问题描述

我在我的解析器中使用 promise.all ,它可以工作,但是现在,我不想要一个承诺数组而是一个对象,但我找不到如何去做。

这是我的尝试:

resolve(route: ActivatedRouteSnapshot): Promise<any> {

  return Promise.all([
    this.service1.getAll(),
    this.service2.getAll(),
    this.service3.getAll()]
      .map((result) => {
        first: result[0],
        second: result[1],
        third: result[2]
      })
  ) 
}

如您所见,我想将数组转换为具有键值的对象

如何映射结果以获取对象而不是数组?

标签: angularpromise

解决方案


您实际上可以在此处使用es6 中的解构。由于您Promise.all(...)将解析为其中包含三个项目的数组,因此您可以将其[first, second, third]作为箭头函数的参数,并且 JavaScript 会将这些项目从数组中的位置取出并将它们设置为具有相应名称的变量(即。first、、、在这种情况下)secondthird

此外,如果您保持变量名称与对象的属性名称相同,则可以使用下面的简写语法来创建对象。

resolve(route: ActivatedRouteSnapshot): Promise<any> {
    return Promise.all([
        this.service1.getAll(),
        this.service2.getAll(),
        this.service3.getAll()
    ]).then(([first, second, third]) => ({ first, second, third }));
}

作为参考,TypeScript 将代码.then(...)转换为以下 es5 JavaScript:

.then(function (_a) {
    var first = _a[0], second = _a[1], third = _a[2];
    return ({ first: first, second: second, third: third });
})

推荐阅读