Tôi đang sử dụng the Q module cho Node.js để tránh "kim tự tháp doom" trong các trường hợp mà tôi có nhiều bước. Ví dụ:Làm cách nào để hủy bỏ chuỗi lời hứa của node.js bằng Q?
function doTask(task, callback)
{
Q.ncall(task.step1, task)
.then(function(result1){
return Q.ncall(task.step2, task);
})
.then(function(result2){
return Q.ncall(task.step3, task);
})
.fail(callback).end();
}
Về cơ bản, điều này dường như hiệu quả; nếu một lỗi được ném bởi bất kỳ bước nhiệm vụ nào, nó sẽ được chuyển tới hàm gọi lại (mặc dù tôi sẽ được chào đón để cải tiến, vì tôi là mới đối với các lời hứa của node.js). Tuy nhiên, tôi có một vấn đề khi tôi cần phải hủy bỏ chuỗi nhiệm vụ sớm. Ví dụ, nếu result1 được trả về thành công tôi có thể muốn gọi gọi lại sớm và hủy bỏ phần còn lại, nhưng những nỗ lực của tôi để làm như vậy được không ...
function doTask(task, callback)
{
Q.ncall(task.step1, task)
.then(function(result1){
if(result1)
{// the rest of the task chain is unnecessary
console.log('aborting!');
callback(null, result1);
return null;
}
return Q.ncall(task.step2, task);
})
.then(function(result2){
console.log('doing step 3...');
return Q.ncall(task.step3, task);
})
.fail(callback).end();
}
Trong ví dụ này, tôi thấy cả hai "hủy!" và "đang thực hiện bước 3 ..." được in.
Tôi chắc chắn rằng tôi chỉ hiểu lầm một số nguyên tắc cơ bản ở đây, vì vậy sẽ đánh giá cao bất kỳ trợ giúp nào. Cảm ơn!
Một giải pháp tôi thấy là để tạo ra một chuỗi lời hứa riêng biệt sau chuỗi đầu tiên có thể phá vỡ. Hơn nữa, trong ví dụ trên, câu lệnh .then với result2 sẽ được gắn với Q.ncall cho bước 2, thay vì được gắn với lời hứa ban đầu. BAO GIỜ, nhược điểm chính ở đây là nó được loại bỏ một trong những lợi ích chính cho Q theo ý kiến của tôi: tránh các kim tự tháp của doom! Nó vẫn còn tốt hơn không hứa hẹn gì cả, nhưng tôi không thích giải pháp ... –