我正在尝试使用q.js
创建一个延迟包装器,以便我可以在自定义错误类中将错误(字符串)包装起来,然后再由then()
或{{中的承诺传回1}}。这就是我现在正在做的事情:
fail()
所以想法是用户会做类似
的事情var getDeferred = function() {
var deferred = q.defer();
var reject = deferred.reject;
deferred.reject = function(error) {
if (!(error instanceof MyErrorClass))
error = new MyErrorClass(error)
return reject.apply(deferred, arguments);
}
return deferred;
}
并希望在var deferred = getDeferred();
deferred.promise.fail(function(err) {
// err should now be instance of MyErrorClass and NOT a string
})
deferred.reject('A string error')
处理程序中获取MyErrorClass
,而不是传递给fail()
的字符串。
上面的代码可以工作,但这并不理想 - 我知道我不应该使用猴子修补deferred.reject。但是有更好的方法吗?
答案 0 :(得分:1)
这样更漂亮/更有承诺:
var getDeferred = function() {
var deferred = q.defer();
deferred.promise = deferred.promise.then(null, function(error) {
if (!(error instanceof MyErrorClass))
error = new MyErrorClass(error)
throw error
}
return deferred;
}
这样您只需附加一个错误处理程序,它将改变任何非MyErrorClass
错误。虽然看起来像一个奇怪的用例......
答案 1 :(得分:0)
只需使用then
actualPromise.then(null, function(error) {
if (!(error instanceof MyErrorClass))
error = new MyErrorClass(error)
throw error;
})
.fail(function(err) {
// err is now an instance of MyErrorClass and NOT a string
});
如果您需要包装器功能,请使用带actualPromise
的函数,并使用上面的代码调用then
。