Chìa khóa chung cho quá trình xử lý không đồng bộ là bạn muốn có một số dấu hiệu về thời điểm lặp lại hiện tại được thực hiện trước khi chuyển sang lần lặp tiếp theo. Vì các hoạt động thực tế như .find()
ở đây chính họ sử dụng một "lệnh gọi lại" được "gọi" khi hoạt động được hoàn thành với một phản hồi, sau đó những gì bạn thường muốn làm là gọi một cái gì đó báo hiệu sự kết thúc lặp lại của bạn trong cùng một phần mã.
Theo cách cơ bản, bạn có thể nhận được kết quả tương tự như bạn có thể làm trong các vòng lặp truyền thống với "async.eachSeries " phương thức này sẽ chỉ cho phép "một lần lặp lại tại một thời điểm" diễn ra:
function check (collection) {
var records = [ { body: "Test 1"}, { body: "Test 2" } ];
async.eachSeries(records,function(item,callback) {
collection.find( item, function (err, rows) {
console.log(rows);
callback(err)
});
},function(err) {
if (err) throw err;
console.log("done");
});
}
Vì vậy, mỗi đối số mảng được chuyển vào hàm "iterator" ở đây dưới dạng tham số "item" và đối số thứ hai là một hàm "callback" sẽ được sử dụng sau này. Mỗi khi trình lặp được gọi, đối số đó được chuyển đến .find()
đến lượt nó, có một "callback" của riêng nó, trong đó phản hồi "error" hoặc "Documents" được đưa ra.
Bên trong lệnh gọi lại đó, "lệnh gọi lại" được cung cấp bởi hàm "trình lặp" sau đó được gọi để báo hiệu việc hoàn thành lặp lại hiện tại đó. Điều này cho phép hàm "each" ở đây tiếp tục và thực sự gọi "lần lặp" tiếp theo và xử lý phần tử mảng tiếp theo.
Lưu ý nền tảng của bạn, hãy lưu ý cách chính xác để ghi chú một "mảng" trong JavaScript bằng []
dấu ngoặc như hình. Đây thường là một sự khác biệt quan trọng khi làm việc với mảng.
Có các biến thể khác của "async.each" và "async.eachLimit" cả hai đều cho phép xử lý song song ở một mức độ nào đó, nhưng phương thức "Chuỗi" thực hiện mọi thứ "theo thứ tự" theo cách mà bạn đã quen với các vòng lặp truyền thống.
Vì vậy, nơi các hoạt động của vòng lặp là "không chặn", bạn cần phải biểu thị khi vòng lặp đó hoàn thành trước khi bạn muốn tiếp tục.