我正在尝试处理响应数据,并且在未处理当前数据之前不发出下一个请求。我尝试使用 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 个项目,然后再提出第二个请求?也许我必须使用其他模式或其他什么。
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);
}
我找到了下一个解决方案
(async () => {
for (let i = 0; i < 10; i++) {
item = await transport.readItem();
console.log("R:", item);
}
})();
因为我在没有任何函数/方法的情况下在脚本中运行了这部分代码