Promise 链没有按预期工作

Promise chains don't work as expected

使用下面的代码,即使服务器返回 500,我的控制器的 publish() 也会始终转到 createCompleted()。我的印象是 catch() 会在 400 或 500 时执行代码从服务器返回。

// 在役

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"。