承诺链不;没有按预期工作

Promise chains don't work as expected

本文关键字:工作 承诺      更新时间:2023-09-26

使用下面的代码,即使服务器返回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()总是命中。

这是怎么回事?

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

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

因此,在您的情况下,由于您没有返回任何内容,因此假定它是从返回的promise中解析的,值为"undefined"。