2015-09-23 20 views
14

$q.promise kullanırken catch işlevini kullanarak bir hata geri bildirimi kullanmanın arasında bir fark olup olmadığını bana söyleyebilir misiniz?Vaatler - hata geri bildirimi vs yakalamak

E.g. iki kod parçacığı işlevsel olarak eşdeğerdir?

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); 

Eğer öyleyse, neden ikinci birini kullanın? Çok çirkin görünüyor ve bence daha fazla kod çoğaltma yol açar?

+2

ikinci sürümü ile devam etmek için bir çözüme durumuna tekrar sözünü getirmek için izin verir Bir hata veya reddedilen bir söz dışında bir şey döndürerek zaten zinciri. –

+2

Ve hata işleyicisi reddedilen bir söz atar veya döndürürse, üç kez çağrılır. –

cevap

4

Her ikisi de aynı şeyi elde edecektir, ikincisi errorHandler üç kez (yalnızca bir kez yerine) çalıştırabilir. Bunu bazı kod çoğaltma getirdiği doğru, ama aynı zamanda ne olduysa hata işlendiğini ve zinciri ile devam etmesini sağlar:

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

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

Teşekkürler! Zinciri ilgiyle nasıl devam ettiririm? Yoksa zincirle devam edecek mi? – keldar

+2

@keldar Sadece yukarıdaki örnekte olduğu gibi hata işleyici işlevinizden yeni bir 'Promise' döndürmek zorundasınız! – Marcelo

+2

Bir söz vermene gerek yok. Bir değeri kolayca döndürebilirsiniz. –