保证所有将结果转换为对象

时间:2018-11-06 15:54:33

标签: angular promise

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

这是我的尝试:

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]
      })
  ) 
}

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

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

3 个答案:

答案 0 :(得分:3)

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

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

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 });
})

答案 1 :(得分:0)

尝试这种方式

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

 return Promise.all([
this.service1.getAll(),
this.service2.getAll(),
this.service3.getAll()]
  .map((result) => {
    this.allData = Object.assign({},result)
  })
 ) 
} 

我希望这可以帮助您... :)

Data in object

答案 2 :(得分:0)

您可以使用 ES6

const [x,y,z] = ['E','S','6'];
// x = 'E'
// y = 's'
// z = '6'

因此您可以将其用于 Promise.all

const [first, second, third] = await Promise.all([
  this.service1.getAll(),
  this.service2.getAll(),
  this.service3.getAll()
]);