【问题标题】:throw Error after promise is rejected - Q承诺被拒绝后抛出错误 - Q
【发布时间】:2015-07-16 23:05:41
【问题描述】:

以下是在 Q 中使用 Promise 的简短示例。

这是 test1.js:

function testDefer() {
    var deferred = Q.defer();
    fs.readFile("foo.txt", "utf-8", function (error, text) {
        if (error) {
            deferred.reject(new Error(error));
        } else {
            deferred.resolve(text);
        }
    });
    return deferred.promise;
}

这是 test2.js

(function(){
    'use strict';
    var test1 = require('./test1');
    test1.testDefer().then(
        function(data){
            console.log('all good');
        },
        function(err) {
            //upon error i might want to throw an exception, however, it is not thrown / ignored.
            throw new Error('I want to throw this exception');
        }
    );
})();

我想在 test2 中抛出一个异常,以防 promise 被拒绝(或者在某些情况下它被解决)。无论如何,异常会被忽略,程序会在不抛出异常的情况下结束。

我的问题是,如何从成功/失败函数中抛出错误?

谢谢

【问题讨论】:

    标签: javascript node.js promise q


    【解决方案1】:

    then 处理程序中的所有错误都被捕获并用于拒绝生成的承诺。你想要的是done method:

    很像then,但在未处理时有不同的行为 拒绝。如果有未处理的拒绝,要么是因为 promise 被拒绝并且没有提供 onRejected 回调,或者 因为onFulfilledonRejected 抛出错误或返回 被拒绝的承诺,产生的拒绝原因被抛出为 在事件循环的未来轮次中出现异常。

    这个方法应该用来终止承诺链 不能通过其他地方。由于在then 回调中抛出异常 被消耗并转化为拒绝,结束时的异常 链条很容易一不小心,默默无视。通过安排 在事件循环的未来轮次中抛出的异常,以便 它不会被捕获,它会在浏览器上引发onerror 事件 window,或 Node.js 的 process 上的 uncaughtException 事件 对象。

    donethen 用法的黄金法则是:return 你的 向其他人承诺,或者如果链以您结束,请致电done 终止它。

    Q.ninvoke(fs, "readfile", "foo.txt", "utf-8").done(function(data){
        console.log('all good');
    }, function(err) {
        throw new Error('I want to throw this exception');
    }); // or omit the error handler, and 'err' will be thrown
    

    【讨论】:

    • +1 为什么不具体说明示例 (test1.testDefer().done...)?
    • 因为我想暗示Deferred anti pattern :-)
    • 哦,对了。我不认识ninvoke,我习惯了promisify,这更清晰......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 2018-05-09
    • 2017-03-28
    • 1970-01-01
    • 2017-06-19
    相关资源
    最近更新 更多