在进一步处理之前,我需要等待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/after
,before/after
等几对。
最终,目标是能够在应用程序中构建一个小的层,该层为少数几个API方法的每一个提供功能,并让其余代码编写如下:
makeStuff(...); // ends up invoking a HTTP endpoint
doThis(...); // ends up invoking a HTTP endpoint
getThat(...); // ends up invoking a HTTP endpoint
我认为await
可以(也)做到这一点:将异步功能用作同步。我有想念吗?
答案 0 :(得分:1)
由于您的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 => ...);