承诺被拒绝后抛出错误 - 问:

Ash*_*ban 2 javascript node.js promise q

以下是使用Q的承诺的简短示例.

这是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;
}
Run Code Online (Sandbox Code Playgroud)

这是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');
        }
    );
})();
Run Code Online (Sandbox Code Playgroud)

我想在test2中抛出异常,以防止承诺被拒绝(或者在某些情况下它被解决).无论如何,异常被忽略,程序完成而不抛出异常.

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

谢谢

Ber*_*rgi 9

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

很像then,但是在未处理的拒绝方面有不同的行为.如果存在未处理的拒绝,或者因为 promise被拒绝而没有onRejected提供回调,或者因为onFulfilled或者onRejected抛出了错误或者返回了被拒绝的承诺,则在事件循环的未来转向中抛出所得到的拒绝原因作为异常.

应该使用此方法来终止不会在其他地方传递的承诺链.由于then回调中抛出的异常被消耗并转换为拒绝,因此链末端的异常很容易被意外地忽略.通过安排在事件循环的未来转向中抛出异常,以便它不会被捕获,它会导致onerror浏览器上 windowuncaughtException事件或Node.js process 对象上的事件.

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
Run Code Online (Sandbox Code Playgroud)