📅  最后修改于: 2023-12-03 15:08:26.343000             🧑  作者: Mango
在 JavaScript 中,常常需要在循环中执行异步操作,比如从服务器获取数据或者执行耗时的计算任务。如果不正确地处理这些异步操作,可能会导致程序出现错误或者出现性能问题。
在 ES6 中引入的 Promise 对象,可以用来处理异步操作,而使用 async/await 结合 Promise,可以使异步任务更加直观和易于处理。本文将介绍如何使用带有 Promise 的 async/await 延迟 JavaScript 中的循环。
下面是一个使用 Promise 和 async/await 实现延迟循环的示例:
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
async function delayedLoop(array, callback, interval) {
for (let item of array) {
await callback(item);
await delay(interval);
}
}
const array = [1, 2, 3];
async function logArrayItem(item) {
console.log(item);
}
await delayedLoop(array, logArrayItem, 1000);
代码解释:
delay
函数接收一个时间参数 ms
,返回一个 Promise,等待 ms
毫秒后返回一个 resolve 状态。delayedLoop
函数接收三个参数:数组,回调函数和时间间隔。logArrayItem
函数是一个简单的回调函数,用于打印数组中的元素。await delayedLoop
和上面定义的参数来执行循环。有时候,我们需要限制异步操作的数量,以控制程序的资源使用情况和提高性能。下面是一个使用 Promise 和 async/await 实现限制并发的异步操作的示例:
async function limitConcurrent(max, items, asyncFn) {
const results = [];
const executing = [];
for (const item of items) {
const promise = asyncFn(item);
results.push(promise);
if (executing.length >= max) {
await Promise.race(executing);
}
executing.push(promise);
const index = executing.indexOf(promise);
await promise.catch(() => {});
executing.splice(index, 1);
}
return Promise.all(results);
}
const urls = ['url1', 'url2', 'url3', 'url4', 'url5'];
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function getData(url) {
console.log(`Getting data from ${url}...`);
await sleep(Math.random() * 2000 + 1000);
console.log(`Got data from ${url}.`);
}
await limitConcurrent(2, urls, getData);
代码解释:
limitConcurrent
函数接收三个参数:最大并发数,一个包含异步操作的数组和一个异步操作函数。在本文中,我们介绍了如何使用 Promise 和 async/await 结合延迟循环和限制并发的异步操作。这些方法可以帮助我们更好地控制异步操作,提高性能和可维护性。