Lập trình Promise với BlueBird qua ví dụ - Phần 1
Lập trình Promise với BlueBird qua ví dụ - Phần 2
Hàm map của array là blocking, ngược lại map của BlueBird là non blocking. Chạy lệnh ngắn với map.array thì không sao, chạy tác vụ dài là chết đó.

var promise = require("bluebird");
//giả lập hàm chạy tốn thời gian
function wait(miliSeconds) {
    var startTime = new Date().getTime();
    while (new Date().getTime() < startTime + miliSeconds);
}

var arr = [1, 2, 3];
console.time('blocking');
arr.map(function(item){
    wait(1000);
    console.log(item + ' * 2 = ' + item * 2);
});
console.timeEnd('blocking');

console.time('nonblocking');
promise.map(arr, function(item){
    wait(1000);
    console.log(item + ' * 2 = ' + item * 2);
});
console.timeEnd('nonblocking');

Hãy chạy thử trên máy của bạn để trải nghiệm, so sánh sự khác biệt. Kết quả in ra console như sau

1 * 2 = 2
2 * 2 = 4
3 * 2 = 6
blocking: 3001ms
nonblocking: 1ms
1 * 2 = 2
2 * 2 = 4
3 * 2 = 6

promise.map không block lệnh tiếp theo chạy cho dù mỗi lệnh in trong promise.map cũng phải chờ 1000 milisecond.

Sử dụng array.map gọi hàm blocking call thực ra cũng gây lỗi Zalgo tiềm tàng như trong bài tôi viết trước đây. Do đó, nếu bạn chưa thấy sẵn sàng dùng BlueBird hoặc cần tối ưu tốc độ thì sử dụng process.nextTick. Lúc này arr.map không bị blocking khi duyệt từng phần tử mảng nữa.

arr.map(function(item){
    var i = item;
    process.nextTick(function(i) {
        wait(1000);
        console.log(item + ' * 2 = ' + item * 2);
    });
});