2015-09-23 29 views
14

Ai đó có thể cho tôi biết nếu có sự khác biệt giữa việc sử dụng lỗi gọi lại với chức năng catch, khi sử dụng $q.promise vui lòng?Lời hứa - gọi lại lỗi so với số điện thoại

Ví dụ: hai đoạn mã tương đương với hàm là gì?

function doSomething0() { 
    var deferred = $q.defer(); 

    ... 

    return deferred.promise; 
} 

doSomething0() 
    .then(doSomething1) 
    .then(doSomething2) 
    .then(doSomething3) 
    .catch(function (err) { 
     // do something with `err` 
    }); 

vs

function doSomething0() { 
    var deferred = $q.defer(); 

    ... 

    return deferred.promise; 
} 

function errorHandler(err) { 
    // do something with `err` 
} 

doSomething0() 
    .then(doSomething1, errorHandler) 
    .then(doSomething2, errorHandler) 
    .then(doSomething3, errorHandler); 

Nếu vậy, tại sao sử dụng cái thứ hai? Nó trông xa xấu xí hơn và dẫn đến sao chép mã nhiều hơn trong quan điểm của tôi?

+2

Phiên bản thứ hai cho phép bạn đưa lời hứa trở lại trạng thái đã giải quyết để tiếp tục với chuỗi bằng cách trả lại bất kỳ điều gì khác ngoài lỗi hoặc lời hứa bị từ chối. –

+2

Và nếu trình xử lý lỗi ném hoặc trả về một lời hứa bị từ chối, nó sẽ được gọi ba lần. –

Trả lời

4

Cả hai đều sẽ đạt được điều tương tự, ngoại trừ thứ hai có thể chạy errorHandler ba lần (thay vì chỉ một lần). Bạn đúng rằng nó mang lại một số mã trùng lặp, nhưng nó cũng cho phép bạn xử lý bất kỳ lỗi nào đã xảy ra và tiếp tục với chuỗi của bạn:

function errorHandler(err) { 
    //log error, continue 
    return $q.resolve('default value or something'); 
} 

doSomething0() 
    .then(doSomething1, errorHandler) 
    .then(doSomething2, errorHandler) 
    .then(doSomething3, errorHandler); 
+0

Cảm ơn bạn! Làm thế nào tôi sẽ tiếp tục với chuỗi không quan tâm? Hay nó sẽ tiếp tục với chuỗi? – keldar

+2

@keldar bạn chỉ cần trả lại một 'Lời hứa' mới từ hàm xử lý lỗi của bạn, giống như trong ví dụ trên! – Marcelo

+2

Không cần phải trả lời hứa. Bạn chỉ có thể trả về một giá trị. –

Các vấn đề liên quan