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中抛出异常,以防止承诺被拒绝(或者在某些情况下它被解决).无论如何,异常被忽略,程序完成而不抛出异常.
我的问题是,如何从成功/失败函数中抛出错误?
谢谢
then处理程序中的所有错误都被捕获并用于拒绝产生的承诺.你想要的是done方法:
很像
then,但是在未处理的拒绝方面有不同的行为.如果存在未处理的拒绝,或者因为promise被拒绝而没有onRejected提供回调,或者因为onFulfilled或者onRejected抛出了错误或者返回了被拒绝的承诺,则在事件循环的未来转向中抛出所得到的拒绝原因作为异常.应该使用此方法来终止不会在其他地方传递的承诺链.由于
then回调中抛出的异常被消耗并转换为拒绝,因此链末端的异常很容易被意外地忽略.通过安排在事件循环的未来转向中抛出异常,以便它不会被捕获,它会导致onerror浏览器上window的uncaughtException事件或Node.jsprocess对象上的事件.
done与then使用相关的黄金法则是: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)
| 归档时间: |
|
| 查看次数: |
4847 次 |
| 最近记录: |