2015-02-05 164 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