【发布时间】:2014-09-28 09:22:15
【问题描述】:
处理这种情况的最佳方法是什么。我处于受控环境中,我不想崩溃。
var Promise = require('bluebird');
function getPromise(){
return new Promise(function(done, reject){
setTimeout(function(){
throw new Error("AJAJAJA");
}, 500);
});
}
var p = getPromise();
p.then(function(){
console.log("Yay");
}).error(function(e){
console.log("Rejected",e);
}).catch(Error, function(e){
console.log("Error",e);
}).catch(function(e){
console.log("Unknown", e);
});
当从 setTimeout 内抛出时,我们总是会得到:
$ node bluebird.js
c:\blp\rplus\bbcode\scratchboard\bluebird.js:6
throw new Error("AJAJAJA");
^
Error: AJAJAJA
at null._onTimeout (c:\blp\rplus\bbcode\scratchboard\bluebird.js:6:23)
at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)
如果抛出发生在 setTimeout 之前,那么 bluebirds catch 会捡起它:
var Promise = require('bluebird');
function getPromise(){
return new Promise(function(done, reject){
throw new Error("Oh no!");
setTimeout(function(){
console.log("hihihihi")
}, 500);
});
}
var p = getPromise();
p.then(function(){
console.log("Yay");
}).error(function(e){
console.log("Rejected",e);
}).catch(Error, function(e){
console.log("Error",e);
}).catch(function(e){
console.log("Unknown", e);
});
结果:
$ node bluebird.js
Error [Error: Oh no!]
这很好 - 但是如何在节点或浏览器中处理这种性质的流氓异步回调。
【问题讨论】:
-
将 settimeout(或异步方法)包装在一个 Promise 中,以便像处理其他所有内容一样处理它。
标签: javascript node.js asynchronous promise bluebird