2016-09-16 47 views
2

進行以下兩項測試。第一次測試: -爲什麼在Angular返回荒謬的結果鏈接`然後`?

var d = $q.defer(); 

d.promise.then(null, null) 

.then(function() { 
    console.log('success'); 
}, function() { 
    console.log('fail'); 
}); 

d.reject(); // Prints fail, as expected 

二測: -

var d = $q.defer(); 

d.promise.then(null, function() {}) // Notice second argument is not null 

.then(function() { 
    console.log('success'); 
}, function() { 
    console.log('fail'); 
}); 

d.reject(); // Prints success! 

爲什麼在第二次測試我收到 '成功' 的消息?

的jsfiddle - https://jsfiddle.net/7agszh95/

回答

4

在你失敗的處理程序傳遞的第一次調用.then()第二種情況。假定該函數處理了錯誤,所以無論它返回什麼,都會傳遞給鏈中下一個promise的成功處理程序(除非它返回一個promise,然後鏈中的下一個promise將得到解析或拒絕的結果返回的承諾)。

如果您想要失敗處理程序但不希望它將問題標記爲已解決,則需要返回一個指示進一步失敗的值。 return $q.reject()是執行此操作的最簡單方法,但您可能也想傳播實際的錯誤:

var d = $q.defer(); 

d.promise.then(null, function (err) { 
    return $q.reject(err); // Indicate that we didn't manage to handle the error 
}) 

.then(function() { 
    console.log('success'); 
}, function (err) { 
    console.log('fail: '+err); 
}); 

d.reject('some error');