Bạn không thể kết hợp đồng bộ và không đồng bộ trong JavaScript nếu bạn chặn tập lệnh, bạn chặn Trình duyệt.
Bạn cần phải đi theo hướng sự kiện đầy đủ ở đây, may mắn là chúng ta có thể giấu những thứ xấu xí đi.
CHỈNH SỬA: Đã cập nhật mã.
function asyncLoop(iterations, func, callback) {
var index = 0;
var done = false;
var loop = {
next: function() {
if (done) {
return;
}
if (index < iterations) {
index++;
func(loop);
} else {
done = true;
callback();
}
},
iteration: function() {
return index - 1;
},
break: function() {
done = true;
callback();
}
};
loop.next();
return loop;
}
Điều này sẽ cung cấp cho chúng tôi một không đồng bộ loop, tất nhiên bạn có thể sửa đổi nó hơn nữa để lấy ví dụ như một hàm để kiểm tra điều kiện vòng lặp, v.v.
Bây giờ đến bài kiểm tra:
function someFunction(a, b, callback) {
console.log('Hey doing some stuff!');
callback();
}
asyncLoop(10, function(loop) {
someFunction(1, 2, function(result) {
console.log(loop.iteration());
loop.next();
})},
function(){console.log('cycle ended')}
);
Và đầu ra:
Hey doing some stuff!
0
Hey doing some stuff!
1
Hey doing some stuff!
2
Hey doing some stuff!
3
Hey doing some stuff!
4
Hey doing some stuff!
5
Hey doing some stuff!
6
Hey doing some stuff!
7
Hey doing some stuff!
8
Hey doing some stuff!
9
cycle ended
( /* ... */ )trông giống như một con quái vật và bây giờ tôi đang sợ hãi :(