js异步串行队列
用途
处理一些避免异步并行的情况
代码
// 创建一个异步队列处理函数
function createAsyncQueueProcessor() {
const queue = [];
let isProcessing = false;
// 异步队列处理函数
async function processAsyncQueue() {
if (queue.length === 0) {
isProcessing = false; // 队列已空,设置为未处理状态
return;
}
isProcessing = true;
const task = queue.shift(); // 取出队列的第一个元素
try {
const result = await task.handler();
if (task.callback) {
await task.callback(result);
}
} catch (error) {
if (task.fail) {
await task.fail(error);
}
}
// 处理下一个任务(递归调用)
processAsyncQueue();
}
// 往队列新增元素的方法
function addToAsyncQueue(task) {
queue.push(task);
// console.log(`当前队列剩余长度: ${queue.length}`)
// 如果当前队列未在处理中,则开始处理队列
if (!isProcessing) {
processAsyncQueue();
}
}
return addToAsyncQueue;
}
module.exports = {
createAsyncQueueProcessor,
// addAsyncQueue: createAsyncQueueProcessor()
}
示例
// 模拟一个异步操作,返回一个Promise,等待指定的时间后resolve
function simulateAsyncOperation(data, delay) {
return new Promise(resolve => {
setTimeout(() => resolve(data), delay);
});
}
// 示例使用
async function main() {
const addToQueue = createAsyncQueueProcessor();
setTimeout(() => {
addToQueue({
handler: () => simulateAsyncOperation(1, 1000),
callback: async (result) => console.log('Task 1 resolved with result:', result),
fail: async (error) => console.error('Task 1 rejected with error:', error),
});
}, 1000);
setTimeout(() => {
addToQueue({
handler: () => simulateAsyncOperation(2, 2000),
callback: async (result) => console.log('Task 2 resolved with result:', result),
fail: async (error) => console.error('Task 2 rejected with error:', error),
});
addToQueue({
handler: () => simulateAsyncOperation(3, 1500),
callback: async (result) => console.log('Task 3 resolved with result:', result),
fail: async (error) => console.error('Task 3 rejected with error:', error),
});
}, 3000);
console.log('Adding elements to the queue...');
}
main();