代码之家  ›  专栏  ›  技术社区  ›  Sylvain Leroux

从JS对象文本中的异步函数初始化的字段:它们会破坏并发性吗?

  •  1
  • Sylvain Leroux  · 技术社区  · 7 年前

    在JavaScript对象文本中,有没有一种方法可以用异步函数的结果初始化某些字段,同时确保它们仍然同时运行?

    async function f() { /* ... */; return 0; }
    async function g() { /* ... */; return 1; }
    
    async function init() {
      const o = { f: f(), g: g() };
      return o;
    }
    
    init().then(console.log)
    //> { f: Promise { ... }, f: Promise { ... } }
    // XXX not what I want: I want *values* not promises
    

    如果我写上面的代码, f() g() 是并行解决的,但是 obj.f obj.g 将保留函数返回的承诺,而不是解析的值。

    另一方面,使用下面的语法,我获得了一个对象,其字段包含值,但在我看来 f() 和 呼叫被按顺序解析。还是我错了?

    async function init() {
      const o = { f: await f(), g: await g() };
      return o;
    }
    
    init().then(console.log)
    //> { f: 0, g: 1 }
    // ??? did `f()` and `g()` run concurrently or sequentially here?
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Bergi    7 年前

    不,你需要使用 Promise.all 要等待多个并发事件,请执行以下操作:

    async function getF() { /* ... */; return 0; }
    async function getG() { /* ... */; return 1; }
    
    async function init() {
      const [f, g] = await Promise.all([getF(), getG()]);
      return {f, g};
    }
    
    init().then(console.log);