代码之家  ›  专栏  ›  技术社区  ›  rap-2-h

将promise.all结果分配给对象属性

  •  0
  • rap-2-h  · 技术社区  · 6 年前

    如果我想将两个已解决的承诺分配给两个变量,我可以这样做:

    const [a, b] = await Promise.all([first(), second()])
    

    但是指定我有一个具有属性的对象,而不是 a b ,如何将结果影响到对象属性?

    这不起作用:

    const x = {}
    const [x.a, x.b] = await Promise.all([first(), second()])
    

    有办法吗?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Bergi    6 年前

    你不能用 const (声明变量)如果要分配给属性:

    const x = {};
    [x.a, x.b] = await Promise.all([first(), second()]);
    

    注意到 semicolon is necessary here ,如果您想忽略它们并让它们自动插入到 可能的 需要,你会的 need to put one at the begin 线:

    const x = {}
    ;[x.a, x.b] = await Promise.all([first(), second()])
    
        2
  •  2
  •   zzzzBov    6 年前

    如果你在找一条航线,我很抱歉让你失望。解引用赋值用于将对象扩展为变量,而不是对象之间的数据映射。

    我也会鼓励你 avoid clever code 因为如果很难阅读,就很难理解,这意味着很难验证它在所有合适的边缘情况下是否按预期工作。

    在这种情况下,添加更多的行非常简单和清晰:

    const [a, b] = await Promise.all([first(), second()])
    
    const x = {
      a,
      b
    }
    

    作为后续问题,如果你不想生产 a b 当前范围内的变量?例如,如果 已经定义,您需要避免命名冲突?

    在这种情况下,增加一些显式代码是有用的:

    const [xA, xB] = await Promise.all([first(), second()])
    
    const x = {
      a: xA,
      b: xB
    }