" async "là một mô-đun rất phổ biến để loại bỏ vòng lặp không đồng bộ và làm cho mã của bạn dễ đọc / bảo trì hơn. Ví dụ:
var async = require('async');
function getHonorStudentsFrom(stuObjList, callback) {
var honorStudents = [];
// The 'async.forEach()' function will call 'iteratorFcn' for each element in
// stuObjList, passing a student object as the first param and a callback
// function as the second param. Run the callback to indicate that you're
// done working with the current student object. Anything you pass to done()
// is interpreted as an error. In that scenario, the iterating will stop and
// the error will be passed to the 'doneIteratingFcn' function defined below.
var iteratorFcn = function(stuObj, done) {
// If the current student object doesn't have the 'honor_student' property
// then move on to the next iteration.
if( !stuObj.honor_student ) {
done();
return; // The return statement ensures that no further code in this
// function is executed after the call to done(). This allows
// us to avoid writing an 'else' block.
}
db.collection("students").findOne({'_id' : stuObj._id}, function(err, honorStudent)
{
if(err) {
done(err);
return;
}
honorStudents.push(honorStudent);
done();
return;
});
};
var doneIteratingFcn = function(err) {
// In your 'callback' implementation, check to see if err is null/undefined
// to know if something went wrong.
callback(err, honorStudents);
};
// iteratorFcn will be called for each element in stuObjList.
async.forEach(stuObjList, iteratorFcn, doneIteratingFcn);
}
Vì vậy, bạn có thể sử dụng nó như thế này:
getHonorStudentsFrom(studentObjs, function(err, honorStudents) {
if(err) {
// Handle the error
return;
}
// Do something with honroStudents
});
Lưu ý rằng .forEach () sẽ gọi hàm trình lặp của bạn cho từng phần tử trong stuObjList "song song" (tức là, nó sẽ không đợi một hàm trình lặp kết thúc được gọi cho một phần tử mảng trước khi gọi nó trên phần tử mảng tiếp theo). Điều này có nghĩa là bạn không thể thực sự dự đoán thứ tự mà các chức năng của trình vòng lặp - hoặc quan trọng hơn, các lệnh gọi cơ sở dữ liệu - sẽ chạy. Kết quả cuối cùng:thứ tự danh dự không thể đoán trước của học sinh. Nếu đơn đặt hàng quan trọng, hãy sử dụng .forEachSeries () chức năng.