NodeJS:通过 API 减少请求

发布时间:2021-02-25 08:40

我正在尝试处理响应数据,并且在未处理当前数据之前不发出下一个请求。我尝试使用 async/await 和生成器。

生成器:

    private *readData() {
        const currentUrl = this.getUrl();
        const requestSettings = this.getRequestSettings();
        yield axios.get( currentUrl, requestSettings).then( (response: any) => {
            console.log('Make request');
            return this.getData(response);
        });
    }

    *readItem() {
        let responseData: any;

        if (!responseData) {
            const response = this.readData();
            responseData = response.next();
        }
        console.log('res data:', responseData['value']);
        yield responseData['value'].then((res: any) => {
            return res;
        });
     }

然后在我接下来做的主代码中:

for (let i=0;i<10;i++) {
    item = transport.readItem().next();
    console.log("R:", item);
}

另一个想法是使用 async/await


async readItems() {
    const headers = this.settings.headers;
    const response = await axios.get( url, {
        headers: headers
    });
    return response.data;
}

但在这种情况下,如果我尝试调用此方法 10 次,我会在响应中得到一个承诺。

我阅读了 10 个项目,但我仍然向服务器发出 10 个请求。是否可以提出一个请求,处理 10 个项目,然后再提出第二个请求?也许我必须使用其他模式或其他什么。

回答1

Async/await 是正确的方法,只需将 await 放在 readItem() 前面,您得到的 Promise 将被 await 处理,从而满足您的需求。如果您的循环在顶级,请使用 readItem().then()。最新的 NodeJS 版本允许在顶层使用 await

for (let i=0;i<10;i++) {
    item = await transport.readItem();
    console.log("R:", item);
}
回答2

我找到了下一个解决方案

(async () => {
    for (let i = 0; i < 10; i++) {
        item = await transport.readItem();
        console.log("R:", item);
    }
})();

因为我在没有任何函数/方法的情况下在脚本中运行了这部分代码