Tôi đã tạo đối tượng này chứa một mảng, phục vụ như một hàng đợi công việc.Hàng đợi công việc JavaScript
Nó loại công trình như thế này:
var work1 = new Work();
var work2 = new Work();
var queue = Workqueue.instance();
queue.add(work1) // Bluebird promise.
.then(function addWork2() {
return queue.add(work2);
})
.then(function toCommit() {
return queue.commit();
})
.then(function done(results) {
// obtain results here.
})
.catch(function(err){});
Nó hoạt động trong trường hợp đó và tôi có thể cam kết nhiều hơn một nhiệm vụ trước khi tôi gọi là cam kết.
Tuy nhiên, nếu đó là như thế này:
var work1 = new Work();
var work2 = new Work();
var queue = Workqueue.instance();
queue.add(work1)
.then(function toCommit1() {
return queue.commit();
})
.then(function done1(result1) {
// obtain result1 here.
})
.catch(function(err){});
queue.add(work2)
.then(function toCommit2() {
return queue.commit();
})
.then(function done2(result2) {
// obtain result2 here.
})
.catch(function(err){});
Something có thể đi sai, bởi vì nếu là người đầu tiên cam kết được gọi sau khi thứ hai cam kết (hai tác phẩm/công việc đã được gia tăng), người đầu tiên cam kết xử lý hy vọng một kết quả nhưng tất cả đều đi đến trình xử lý cam kết thứ hai.
Nhiệm vụ liên quan đến cơ sở dữ liệu Web SQL đã đọc và cũng có thể liên quan đến truy cập mạng. Vì vậy, về cơ bản nó là một thủ tục phức tạp nên vấn đề mô tả ở trên có thể xuất hiện. Nếu chỉ có tôi mới có thể triển khai addWorkAndCommit()
bao gồm add
và commit
cùng nhau, nhưng vẫn không đảm bảo vì addWorkAndCommit()
không thể "nguyên tử" theo nghĩa bởi vì chúng liên quan đến các cuộc gọi không đồng bộ. Vì vậy, ngay cả hai cuộc gọi đến addWorkAndCommit()
có thể không thành công. (Tôi không biết làm thế nào để mô tả nó khác hơn là "nguyên tử", kể từ khi JavaScript là đơn luồng, nhưng vấn đề này cây trồng lên).
Tôi có thể làm gì?
Sử dụng mẫu bỏ qua: http://stackoverflow.com/questions/28915677/what-is-the-promise-disposer-pattern –
@BenjaminGruenbaum Tôi không biết cách triển khai trong vấn đề này. – huggie