我正在尝试并行运行两个不相互依赖的异步操作,但我似乎无法让它工作。
const activity = fetchActivity(...)
const progress = fetchProgress(...)
await activity
await progress
当我打印activity
和progress
的属性时,它们都是未定义的。
当我像这样运行它时,属性会显示出来。
const activity = await fetchActivity(...)
const progress = await fetchProgress(...)
我在想以某种方式并行方法await
没有正确等待,因为当我将对象记录到控制台时,它们最终会显示,但直接记录属性不起作用。
更新:
所以显然我无法回答我自己的问题,因为它已经关闭,但首先要感谢那些指导我正确答案的人,尽管没有回答我的问题。
虽然下面给出了我问题的实际解决方案,但这里给出了不使用此方法的原因: 等待多个并发等待操作,我应该寻求已经在任何地方都提到的解决方案。
答:
await
s 的值不存储在变量中,因此之后直接访问它是行不通的。
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()]);
希望对您有所帮助!