gpt4 book ai didi

javascript - 将 await 与 r2 结合使用以等待 HTTP 响应,然后再继续

转载 作者:行者123 更新时间:2023-11-30 20:18:41 26 4
gpt4 key购买 nike

我需要在进一步处理之前等待 HTTP 请求的响应,因为对 API 的多个请求必须按特定顺序完成(有时取决于另一个请求的输出,有时则不然)。

由于 await 关键字(在 async 函数中),我认为以下代码可以实现这一点:

const r2 = require('r2');

const get = async i => {
console.log('before ' + i);
await r2('http://fgeorges.org/');
console.log(' -- after ' + i);
};

for ( let i = 0; i < 5; ++i ) {
get(i);
}

但是这段代码,当使用 Node 8.10.0 执行时,得到以下输出:

before 0
before 1
before 2
before 3
before 4
-- after 0
-- after 1
-- after 2
-- after 3
-- after 4

因为 await,我更希望有几个 before/afterbefore/after

归根结底,我们的目标是能够在应用程序中构建一个小层,为少数 API 方法中的每一个提供一个函数,并让其余代码编写如下:

makeStuff(...);   // ends up invoking a HTTP endpoint
doThis(...); // ends up invoking a HTTP endpoint
getThat(...); // ends up invoking a HTTP endpoint

我认为 await 可以(也)做到这一点:将异步函数用作同步函数。我错过了什么吗?

最佳答案

因为您的 get() 函数也是 async,它会隐式地为其中的每个 await 返回一个 Promise。但是,您的代码没有关注返回的 Promise,因此 for 循环会直接放大。

创建另一个 async 函数并调用它:

const getn = async n => {
for (let i = 0; i < n; i++)
await get(i);
};

getn(5);

这将产生创建 Promise 实例链的效果。循环的迭代(在第一次之后)将有效地发生在链中每个 Promise 的 .then() 回调中。

您不能await getn() 调用,因为调用不在async 函数中,但您可以等待所有 get() 调用都通过显式编写 .then() 来完成:

getn(5).then(result => ...);

关于javascript - 将 await 与 r2 结合使用以等待 HTTP 响应,然后再继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51686369/

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