Mô tả
Module async cung cấp các chức năng khác nhau để làm việc với JavaScript bất đồng bộ trong ứng dụng nodejs. Phương thức async.queue() trả về một queue được dùng để xử lý đồng thời các tiến trình, tức là xử lý nhiều mục cùng một lúc.
Cài đặt và sử dụng async.queue()
Bước 1 – Chạy lệnh sau để khởi tạo node package manager.
npm init
Bước 2 – Cài đặt module async bằng lệnh sau.
npm install --save async
Bước 3 – Import module async bằng câu lệnh dưới trong chương trình của bạn.
const async = require('async')Cú pháp
async.queue('function', 'concurrency value')Tham số
function – Tham số này định nghĩa hàm sẽ được thực thi trên phần tử thêm vào queue.
concurrency value – Trường này định nghĩa số phần tử được xử lý cùng một lúc.
Phương thức async.queue() còn có nhiều phương thức và thuộc tính khác sẽ được dùng khi xử lý các yêu cầu async.
push(element, callback) – Tương tự queue thông thường, phương thức push dùng để thêm phần tử vào đuôi queue.
queue.push(item, callback);
length() – Phương thức length dùng để trả về số phần tử có trong queue tại một thời điểm.
queue.length()
started property – Thuộc tính này trả về giá trị boolean cho biết queue đã bắt đầu xử lý phần tử hay chưa.
queue.started()
unshift(element, callback) – Thuộc tính unshift cũng thêm phần tử vào queue như push(). Khác biệt duy nhất: nó thêm vào đầu (head) trong khi push thêm vào đuôi (tail). Dùng cho phần tử ưu tiên.
queue.unshift(item, callback)
drain() Method – Phương thức này gọi callback khi queue đã thực thi xong tất cả task/phần tử. Chỉ hoạt động khi hàm được mô tả bằng arrow function.
queue.drain(() => { console.log("All Tasks are completely executed..."); }pause() Method – Phương thức này tạm dừng thực thi các phần tử còn lại trong queue. Hàm sẽ tiếp tục sau khi resume() được gọi.
queue.pause()
resume() Method – Phương thức này dùng để tiếp tục thực thi các phần tử bị tạm dừng bằng pause().
queue.resume()
kill() Method – Phương thức này xóa tất cả phần tử còn lại khỏi queue và buộc nó về trạng thái idle.
queue.kill()
idle() Method – Phương thức này trả về trạng thái boolean cho biết queue đang idle hay đang xử lý gì đó.
queue.idle
Ví dụ
Xem một ví dụ để hiểu rõ hơn các khái niệm trên:
// Including the async module const async = require('async'); // Creating an array for all elements execution const tasks = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; // Initializing the queue const queue = async.queue((task, executed) => { console.log("Currently Busy Processing Task " + task); setTimeout(()=>{ // Number of tasks remaining and to be processed const tasksRemaining = queue.length(); executed(null, {task, tasksRemaining}); }, 1000); }, 1); // concurrency value = 1 // Queue is idle initially as no elements are there... console.log(`Queue Started ? ${queue.started}`) // Adding each task from the tasks list tasks.forEach((task)=>{ // Adding the task 5 to the head for priority execution if(task == 5){ queue.unshift(task, (error, {task, tasksRemaining})=>{ if(error){ console.log(`An error occurred while processing task ${task}`); }else { console.log(`Finished processing task ${task}. ${tasksRemaining} tasks remaining`); } }) // Adding all the tasks at tail to be executed except task 5 } else { queue.push(task, (error, {task, tasksRemaining})=>{ if(error){ console.log(`An error occurred while processing task ${task}`); }else { console.log(`Finished processing task ${task}. ${tasksRemaining} tasks remaining`); } }) } }); // Executes the callback when the queue is done processing all the tasks queue.drain(() => { console.log('All items are succesfully processed !'); }) // Checking if the queue is started after adding tasks console.log(`Queue Started ? ${queue.started}`)Đầu ra
C:\home\node>> node asyncQueue.js Queue Started ? False Queue Started ? True Currently Busy Processing Task 5 Finished processing task 5. 9 tasks remaining Currently Busy Processing Task 1 Finished processing task 1. 8 tasks remaining Currently Busy Processing Task 2 Finished processing task 2. 7 tasks remaining Currently Busy Processing Task 3 Finished processing task 3. 6 tasks remaining Currently Busy Processing Task 4 Finished processing task 4. 5 tasks remaining Currently Busy Processing Task 6 Finished processing task 6. 4 tasks remaining Currently Busy Processing Task 7 Finished processing task 7. 3 tasks remaining Currently Busy Processing Task 8 Finished processing task 8. 2 tasks remaining Currently Busy Processing Task 9 Finished processing task 9. 1 tasks remaining Currently Busy Processing Task 10 Finished processing task 10. 0 tasks remaining All items are succesfully processed !