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

时间:2019-01-25 15:10:08

标签: javascript async-await

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

这是我尝试过的:

Oxadata/EXPORT

如果我编写上面的代码,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将保留函数返回的promise,而不是解析的值。

另一方面,使用下面的语法,我得到一个对象,该对象的字段包含值,但是在我看来obj.gf()调用是顺序解决的。还是我在这里错了?

g()

1 个答案:

答案 0 :(得分:3)

否,您需要使用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);