gpt4 book ai didi

javascript - nodejs - 链接依赖的异步操作

转载 作者:太空宇宙 更新时间:2023-11-04 03:14:34 24 4
gpt4 key购买 nike

我有两个异步操作,因此第二个操作的调用使用第一个操作的输出中的输入。使用asyncawait来实现这样的调用,看起来与回调并没有太大的不同。

考虑一下。

async function loop(label, I) {
console.log('%s - Looping for %d times.', label, I)
console.time(label)
for (i = 0; i < I; ++i) {
}
return Promise.resolve(I)
}
//
async function demo0() {
// Refer - https://stackoverflow.com/a/45479579/919480
let I0 = loop('01', 10)
let I1 = loop('02', I0 * 1000)
await I0
await I1
}
//
async function demo1() {
// Refer - https://stackoverflow.com/a/45479579/919480
let I0 = loop('11', 10)
await I0
let I1 = loop('12', I0 * 1000)
await I1
}
//
async function demo2() {
await loop('21', 10).then(async (i) => {
await loop('22', i * 1000)
})
}
//
(async () => {
await demo0()
await demo1()
await demo2()
})()

结果:

01 - Looping for 10 times.
02 - Looping for NaN times.
11 - Looping for 10 times.
12 - Looping for NaN times.
21 - Looping for 10 times.
22 - Looping for 10000 times.

第二个循环应基于第一个循环传递的值进行迭代。在 demo0demo1 中,第二个循环收到 NaN,因为它们是同时触发的。仅在 demo2 中,第二个循环才能收到正确的值。人们也可以通过回调来实现这一行为。

是否有async/await方法来实现此行为?

最佳答案

async 的每次调用函数给你一个 Promise 作为返回,但是 Promise 不能(明智地)添加到数字中,所以你得到 NaN作为返回。

如果你希望能够使用 Promise 的结果,你应该 await并使用结果表达式。如果您await Promise,然后尝试使用原始 Promise,您仍然拥有 Promise,而不是值,因此您应该分配 await ed 对变量的 promise ,例如更改

let I0 = loop('01', 10)
let I1 = loop('02', I0 * 1000)
await I0
await I1

let I0 = loop('01', 10)
const resolveValueI0 = await I0;
let I1 = loop('02', resolveValueI0 * 1000)
await I1

(在 loop 完成之前,您无法调用第二个 I0 ,因为第二个 loop 需要 I0 的 Promise 分辨率中的数字。要么将 Promise 传递给 I1 ,然后让 I1 正确使用它.thenawait )

let I0 = loop('11', 10)
await I0
let I1 = loop('12', I0 * 1000)
await I1

let I0 = loop('11', 10)
const resolveValueI0 = await I0;
let I1 = loop('12', resolveValueI0 * 1000)
await I1

async function loop(label, I) {
console.log('%s - Looping for %d times.', label, I)
console.time(label)
for (i = 0; i < I; ++i) {
}
return Promise.resolve(I)
}
//
async function demo0() {
// Refer - https://stackoverflow.com/a/45479579/919480
let I0 = await loop('01', 10)
let I1 = loop('02', I0 * 1000)
await I0
await I1
}
//
async function demo1() {
// Refer - https://stackoverflow.com/a/45479579/919480
let I0 = loop('11', 10)
const result = await I0
let I1 = loop('12', result * 1000)
await I1
}
//
async function demo2() {
await loop('21', 10).then(async (i) => {
await loop('22', i * 1000)
})
}
//
(async () => {
await demo0()
await demo1()
await demo2()
})()

关于javascript - nodejs - 链接依赖的异步操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58461163/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com