Javascript 承诺链不';I don’我没有按预期工作

Javascript 承诺链不';I don’我没有按预期工作,javascript,angularjs,promise,Javascript,Angularjs,Promise,使用下面的代码,我的控制器的publish()将始终转到createCompleted(),即使服务器返回500。我的印象是,当服务器返回400或500个代码时,就会执行catch() //在职 function create(item) { return $http .post(api, item) .then(createCompleted) .catch(createFailed); function createCompl

使用下面的代码,我的控制器的
publish()
将始终转到
createCompleted()
,即使服务器返回500。我的印象是,当服务器返回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()
总是命中


这是怎么回事?

这是因为您没有正确地传播错误。您需要从
createFailed
函数中抛出异常或显式拒绝

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

因此,在您的情况下,由于您没有返回任何内容,因此假定它是从返回的承诺中解决的,值为“undefined”。

如果我在它的承诺中使用$http的success和error方法(而不是then()和catch()),会不会更好?@mare no,问题是
$http(args)
返回httpPromise和$http(args)。然后。。返回q承诺。但如果返回$http,则会执行两个错误块。但是,如果您想通过转换和传播数据进行更改,您可能希望执行
,然后执行
,而不是成功。的可能重复。另见和