为什么不会触发`.catch`回调

时间:2016-11-02 10:08:26

标签: javascript promise

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

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
});

当我运行它时,不执行带catch的第console.log('error');块。这是为什么?本机承诺的实现是否与Q不同?

2 个答案:

答案 0 :(得分:3)

因为您永远不会rejectchangeUser返回的承诺。您只是throwgetUser返回的承诺链中new Promise,该承诺链在该链中,但不会影响changeUser中构建的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 {};
    });
}

或者:

MessageQueue messageQueue = new MessageQueue(".\\private$\\TestQueue");
var noOFMessages = messageQueue.GetAllMessages().LongCount();

答案 1 :(得分:2)

因为您在resolve函数中嵌套了两个不同的保证链。永远不会在该函数中调用rejectthrow {}函数,因此return new Promise(function (resolve, reject) { return getUser().catch(function (responseData, test) { console.log('boo error'); // this logs `boo error` throw {}; }).then(resolve, reject); }); 不会冒泡。如果您在Chrome中执行此操作,您还会获得“未来的承诺”#39;控制台中的消息。

通过以下方式修复:

return new Promise

或者完全删除--server.endpoint vpp+tcp://127.0.0.1:8529. 行。