【发布时间】:2014-05-01 14:57:45
【问题描述】:
我正在使用此代码将经典的 nodejs 函数转换为 Promise 函数:
Object.defineProperty(Function.prototype, "toPromise", {
enumerable: false,
configurable: false,
writable: false,
value: function(self) {
var $this;
$this = this;
return function() {
var arg, args, deferred, _i, _len;
deferred = Q.defer();
args = [];
for (_i = 0, _len = arguments.length; _i < _len; _i++) {
arg = arguments[_i];
args.push(arg);
}
args.push(function() {
args = Array.prototype.slice.call(arguments);
if (args[0] instanceof Error) {
return deferred.reject.apply($this, args);
} else {
return deferred.resolve.apply($this, args);
}
});
$this.apply(self, args);
return deferred.promise;
};
}
});
我在一个函数上调用它来获取另一个函数。像这样:
exports.list = (function(userid, options, callback) {
// do something
// success ->
callback(data);
// error ->
callback(err)
}).toPromise(this);
但是当一个不是我抛出的异常(SyntaxError、TypeError...)被抛出时,then 或fail 函数不会被调用。如何自动传播?
我试图用它替换 toPromise 但这没有用(即使它与我的函数一起使用)
Object.defineProperty(Function.prototype, "toPromise", {
enumerable: false,
configurable: false,
writable: false,
value: function(self) {
var $this;
$this = this;
return Q.denodeify(this.bind(Kitty));
}
});
我还尝试对then 应用第二个回调,但我也没有工作。
【问题讨论】:
-
WTH 确实
canThis返回了一个承诺(您在其上调用.then())但被放置在您手动toPromise()的函数表达式中呢? -
什么是
error.throwError()?你无法捕捉到的错误抛出在哪里? -
如果
canThis确实接受了回调,那么您的意思是, function(can)而不是).then(function(can)? -
@Bergi 不,我犯了一个错误:这是一个承诺
-
那么你在用这个
callback和.toPromise()做什么?
标签: javascript node.js error-handling q