将rwait与r2一起使用以等待HTTP响应,然后再继续操作

时间:2018-08-04 14:04:11

标签: javascript node.js async-await

在进一步处理之前,我需要等待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可以(也)做到这一点:将异步功能用作同步。我有想念吗?

1 个答案:

答案 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 => ...);