【问题标题】:promise all convert the result into an objectpromise all 将结果转化为对象
【发布时间】:2019-04-10 01:18:31
【问题描述】:

我在我的解析器中使用 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]
      })
  ) 
}

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

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

【问题讨论】:

  • 该对象的结构应该是什么样的?

标签: angular promise


【解决方案1】:

您实际上可以在这里使用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 });
})

【讨论】:

    【解决方案2】:

    你可以用 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()
    ]);
    

    【讨论】:

      【解决方案3】:

      试试这个方法

      resolve(route: ActivatedRouteSnapshot): Promise<any> {
      
       return Promise.all([
      this.service1.getAll(),
      this.service2.getAll(),
      this.service3.getAll()]
        .map((result) => {
          this.allData = Object.assign({},result)
        })
       ) 
      } 
      

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

      【讨论】:

      • 谢谢,但我想换键,我的意思是我不想要 0,我想要 'first'
      • @cucuru 对不起,我没听懂你。你能添加你的预期结果吗?我可以更清楚地了解这一点
      • 我想要示例中的内容 { first: this.service1.getAll(), second, this.service2.getAll()}
      • Promise.all() 返回一个承诺,而不是你可以调用 .map() 的东西,除非你使用像 Bluebird 这样的第三方库,将 .map() 添加到承诺中。默认情况下,标准 Promise 没有 .map() 方法。
      猜你喜欢
      • 1970-01-01
      • 2020-04-23
      • 2019-01-24
      • 2019-12-29
      • 2013-04-19
      • 2011-01-01
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多