获取并行异步/等待工作 javascript



我正在尝试并行运行两个不相互依赖的异步操作,但我似乎无法让它工作。

const activity = fetchActivity(...)
const progress = fetchProgress(...)
await activity
await progress

当我打印activityprogress的属性时,它们都是未定义的。

当我像这样运行它时,属性会显示出来。

const activity = await fetchActivity(...)
const progress = await fetchProgress(...)

我在想以某种方式并行方法await没有正确等待,因为当我将对象记录到控制台时,它们最终会显示,但直接记录属性不起作用。

更新:


所以显然我无法回答我自己的问题,因为它已经关闭,但首先要感谢那些指导我正确答案的人,尽管没有回答我的问题。

虽然下面给出了我问题的实际解决方案,但这里给出了不使用此方法的原因: 等待多个并发等待操作,我应该寻求已经在任何地方都提到的解决方案。

答:


awaits 的值不存储在变量中,因此之后直接访问它是行不通的。

const activity = fetchActivity(...)
const progress = fetchProgress(...)
const activityData = await activity
const progressData = await progress

您的方法返回一个Promise

Promise是一个延迟对象,主要用于帮助处理异步操作。
这是必需的,因为JS是单线程环境。并且您不希望阻止主执行线程或长异步操作。

const promise1 = fetchActivity(...);//将返回一个承诺。

您可以使用Promise.then在解析Promise对象时运行回调,也可以改用async/await

如果您选择等待Promise,它实际上会等到您传递到下一行,即使操作是异步的(例如,线程没有被阻塞,但编码感觉同步(。

如果您不想等到结果,您可能更喜欢使用Promise.then.

const res1 = await promise1; 
const nextLine = 1+1; // will happen after the promise is resolved

promise1.then(res1 => // register callback and do something with the response).
const nextLine = 1+1; // will happen immediately 

现在,在了解什么是Promise之后,可以使用Promise.all方法进行并行执行。

Promise.all接受一系列承诺,并返回一个承诺,该承诺将在解决所有其他承诺时解决。

const fetchActivityPromise = fetchActivity(..)
const fetchProgressPromise = fetchProgress(..)
const promiseRes = Promise.all([fetchActivityPromise, fetchProgressPromise]);
promiseRes.then(r => ...)
console.log('here before the promiseRes.then was called');

你可以改用 Promise.all((:

例如:

await Promise.all([call1(), call2()]);

您可以通过以下方式存储结果:

let [res1, res2] = await Promise.all([call1(), call2()]);

希望对您有所帮助!

最新更新