为什么没有触发`.catch`回调

Why is `.catch` callback not triggered

本文关键字:catch 回调 为什么      更新时间:2023-09-26

我有以下使用本机承诺的代码:

function getUser() {
    return new Promise(function (resolve, reject) {
        reject();
    });
}
function changeUser() {
    return new Promise(function (resolve, reject) {
        return getUser().catch(function (responseData, test) {
            console.log('boo error'); // this logs `boo error`
            throw {};
        });
    });
}
changeUser().then(function () {
    console.log('done');
}).catch(function () {
    console.log('error'); // this is not triggered
});

当我运行它时,不执行具有console.log('error');的第一个catch块。为什么?原生promise的实现与Q不同吗?

因为您从未reject,所以您从changeUser返回的承诺。您只是从getUser返回的promise的链中的throw,它在该链中级联,但不会影响在changeUser中构建的new Promise

任一:

return new Promise(function (resolve, reject) {
    return getUser().then(resolve, function (responseData, test) {
        console.log('boo error'); // this logs `boo error`
        reject();
    });
});

或者:

function changeUser() {
    return getUser().catch(function (responseData, test) {
        console.log('boo error'); // this logs `boo error`
        throw {};
    });
}

因为您在changeUser函数中嵌套了两个不同的promise链。resolvereject函数从未在该函数中被调用,因此throw {}不会冒泡。如果你在Chrome中执行此操作,你还会在控制台中收到一条"Uncaught promise"消息。

要么通过以下方式修复:

return new Promise(function (resolve, reject) {
    return getUser().catch(function (responseData, test) {
        console.log('boo error'); // this logs `boo error`
        throw {};
    }).then(resolve, reject);
});

或者通过完全移除return new Promise线。