2015-02-05 161 views
0

使用下面的代碼,即使服務器返回500,我的控制器的publish()也會始終轉到createCompleted()。我當時的印象是,當從服務器返回400或500代碼時,將執行catch()承諾鏈不按預期工作

//服務

function create(item) { 
    return $http 
     .post(api, item) 
     .then(createCompleted) 
     .catch(createFailed); 

    function createCompleted(response) { 
     return response.data; 
    } 

    function createFailed(error) { 
     $log.error('XHR Failed for create: ' + error.data); 
    } 
} 

//在控制器

function publish(item) { 

    item.published = true; 

    return itemService.create(item) 
     .then(createCompleted) 
     .catch(createFailed); 

    function createCompleted(response) { 
     alertService.add('success', 'success.'); 
     $state.go('^'); 
    } 

    function createFailed(error) { 
     alertService.add('error', 'failed'); 
    } 
} 

而控制器的createFailed()不打,服務createFailed()總是命中。

這是怎麼回事?

+1

http://stackoverflow.com/q/25372160/1048572的可能重複。另請參閱[這些控制流程圖](http://stackoverflow.com/a/24663315/1048572)和http://stackoverflow.com/q/26076511/1048572 – Bergi 2015-02-05 22:02:14

回答

2

那是因爲你沒有正確傳播錯誤。您需要拋出異常或從createFailed函數明確拒絕。

function createFailed(error) { 
    $log.error('XHR Failed for create: ' + error.data); 
    throw error; 
    // or 
    return $q.reject(error); // inject $q 
} 

所以你的情況,因爲你不返回任何東西,假設從值爲「未定義」返回的承諾解決。

+0

如果我使用$ http的成功和錯誤方法承諾(而不是那麼()和catch())會不會更好? – mare 2015-02-05 21:44:50

+0

@mare no,問題將''http(args)'返回httpPromise和$ http(args)。然後..返回q promise。但是,如果你返回$ http,你會得到兩個執行的錯誤塊。但是,如果你想通過轉換和傳播數據來尋找你想做的事情,那就不要成功。 – PSL 2015-02-05 21:53:20

+1

@bergi ..哈哈感謝修復。 :) – PSL 2015-02-05 22:04:56