2016-09-07 41 views
0

我想這已經是一個非常正常的設置的:

return $http.get('some/url') 
.then(function (result) { 
    if (result.data.success) { 
     //Do something useful 
    } else { 
     //We've hit some sort of error 
    } 
}, 
function() { 
    return "Failed to communicate with the server, or the server encountered an error."; 
}); 

我的問題是圍繞如何處理場景中的HTTP調用技術上成功,但我們從服務器獲取的數據很糟糕,無法使用,或者明確指出某些錯誤。我想要做的就是把自己推向承諾鏈的失敗軌道。那樣的話,任何人都可以很好地執行自己的失敗功能,如果這是有道理的。

我知道$ q爲您提供了創建延遲對象所需的工具,然後讓您在任何需要的情況下調用解析或拒絕,但我想知道是否有方法可以在不使用$ q值。

+0

的問題是,爲什麼要使用一個替代的方式來做到這一點? $ q確實爲你完成這項工作,沒有任何問題。 – CodeNashor

+0

@code我想只是爲了保持它儘可能簡單?我覺得一定有辦法。如果不是,我想不是,但如果有的話,似乎我應該知道它。 – ctb

+0

如果你像你應該使用它,沒有比這更簡單的方法。 ;)請注意:http://chariotsolutions.com/blog/post/angularjs-corner-using-promises-q-handle-asynchronous-calls/ – CodeNashor

回答

2

要改變從解析到拒絕狀態的諾言,你可以做兩件事情之一從.then()處理程序:

  1. 返回被拒絕的承諾,對於拒絕接受承諾的原因將成爲父母承諾的拒絕理由。
  2. 拋出異常並且異常值將成爲父承諾的拒絕原因。 .then()會自動捕獲處理函數中的異常,並將其變爲拒絕。

所以,這裏是你可以做的一種方式:

return $http.get('some/url').then(function (result) { 
    if (result.data.success) { 
     //Do something useful 
    } else { 
     //We've hit some sort of error, make promise become rejected 
     throw new Error("invalid data received"); 
    } 
}).catch(function (err) { 
    // log error 
    console.log(err); 
    // make sure promise stays rejected 
    throw err; 
});