foreach 循环调取接口 使用for await解决bug
时间: 2023-06-15 20:04:11 浏览: 171
在 JavaScript 中,使用 `for..of` 或 `forEach` 循环来遍历一个数组或一个类数组对象时,是同步地进行的。如果在循环体内部调用了异步操作(例如调用接口),则会出现问题,因为循环不会等待异步操作完成,就直接执行下一次循环,导致结果不正确。
解决这个问题的方法是使用 `for await..of` 循环,它可以用于遍历支持异步迭代的对象,例如异步生成器和异步迭代器。使用 `for await..of` 循环可以确保在每次循环中等待异步操作完成后再执行下一次循环。
以下是使用 `for await..of` 循环调用接口的示例代码:
```javascript
async function fetchData() {
const urls = ['api/url1', 'api/url2', 'api/url3'];
for await (const data of getData(urls)) {
console.log(data);
}
}
async function* getData(urls) {
for (const url of urls) {
const response = await fetch(url);
const data = await response.json();
yield data;
}
}
```
在上面的代码中,`fetchData` 函数调用了 `getData` 函数,并使用 `for await..of` 循环遍历异步生成器返回的数据。`getData` 函数接收一个 URL 数组,并使用 `for..of` 循环遍历 URL,调用 `fetch` 方法获取数据,然后使用 `yield` 关键字返回数据给异步生成器。在 `fetchData` 函数中,`for await..of` 循环等待异步生成器返回数据,并输出到控制台。这样就可以确保在每次循环中等待异步操作完成后再执行下一次循环,避免了使用 `forEach` 循环时出现的问题。
阅读全文