Javascript 重构:从值或现有承诺返回承诺 我的情景
我以前使用Javascript 重构:从值或现有承诺返回承诺 我的情景,javascript,node.js,promise,q,Javascript,Node.js,Promise,Q,我以前使用回调完成了一些node.js实现,但现在我正在重构代码,改用承诺——使用Q模块。我有下面的update()函数,其中内部的\u update()函数已经返回了一个Promise: exports.update = function(id, template, callback) { if (!_isValid(template)){ return callback(new Error('Invalid data', Error.INVALID_DATA)); }
回调
完成了一些node.js
实现,但现在我正在重构代码,改用承诺
——使用Q
模块。我有下面的update()
函数,其中内部的\u update()
函数已经返回了一个Promise
:
exports.update = function(id, template, callback) {
if (!_isValid(template)){
return callback(new Error('Invalid data', Error.INVALID_DATA));
}
_update(id, template) // this already returns a promise
.then(function() {
console.log('UPDATE was OK!');
callback();
}, function(err) {
console.log('UPDATE with ERRORs!');
callback(err);
});
};
我的问题
我希望实现以下目标:
因为\u update()
已经返回了一个承诺
,我想用这种方式更改它就足够了(不是吗?):
而且。。。如果if子句中的条件
等于true
,该怎么办?我如何重构
返回回调(新错误('Invalid data',BaboonError.Invalid_data))代码>
抛出错误
以避免将回调
传递到update()
中并处理该错误(或者任何错误都可能返回\u update()
)
另外,调用update()
:
在我的代码中的其他地方:
- 如果在
promise
传播过程中出现错误,则应进行处理
- 或者,如果没有错误,它应该做一些其他的事情
我接近我所期望的了吗?我怎样才能最终实现它呢?我只看到两个问题
如果您想要显式地返回一个带有值的被拒绝承诺,那么您应该使用
呼唤承诺意味着承诺到此为止。它不能再被束缚了
那么,您的代码将如下所示
exports.update = function (id, template) {
if (!_isValid(template)) {
return Q.reject(new Error('Invalid data', Error.INVALID_DATA));
}
return _update(id, template);
};
现在,update
函数只返回一个始终承诺。由调用方将成功或失败处理程序附加到它。返回???.done()
不返回promise@JaromandaX是的,明白了!归还就够了<代码>完成()
仅用于终止链。干杯是的,打电话的人应该这样做——在这种情况下,是我,所以我想确保这可以做到!顺便说一下,为了让事情更清楚:我们在这里使用Q.reject
,因为\u update()
已经返回了一个承诺,因此使用延迟的s或新的Q.Promise
s将使用一些承诺反模式,对吗?
return _update(id, template)
.done();
myModule.update(someId, someTemplate)
.then(function() { /* if the promise returned ok, let's do something */ })
.catch(function(err) { /* wish to handle errors here if there was any */});
exports.update = function (id, template) {
if (!_isValid(template)) {
return Q.reject(new Error('Invalid data', Error.INVALID_DATA));
}
return _update(id, template);
};