鉴于,我有一些这样的代码:
// code bits to be executed
var X = ...;
var pre = ...;
var success = ...;
var error = ...;
var post = ...;
我会像这样用Bluebird运行它:
X
.then(function(val) {
pre(val);
success(val);
post(val);
})
.catch(function(err) {
pre();
error(err);
post();
});
我正在寻找更简单的东西(在那里,我可以定义更少function
s),如下所示:
X
.complete(function(err, val) {
pre(val);
if (err) {
error(err);
}
else {
success(val);
}
post(val);
});
请注意,我无法使用finally
,因为它没有参数,err
和val
。
另请注意,如果出现错误,val
将被视为null
或undefined
。
if
并保持事物& #34;环连接&#34)...
答案 0 :(得分:5)
你可以走出一个承诺链回到nodeify
的回调土地,它会使节点错误回复:
.nodeify(function(err, val) {
pre(val);
if (err) {
error(err);
}
else {
success(val);
}
post(val);
});
这对于需要公开类似接口的节点错误的代码非常有用。
但是,我不认为在这里使用.nodeify
是一个非常好的主意 - 而是你可以这样做:
.finally(pre) // you always need this
.then(success, error) // call success and error and recover
.then(post); // post, this requires that `success` also returns val
一般情况下,不希望拥有成功/失败功能 - 这称为The .then(success, fail)
anti-pattern,并表示您应该考虑重构代码以接受承诺。
一般情况下,如果您的函数是:
,您可以返回承诺,而不是像您的示例中那样获取成功和错误回调。function doStuff(success, error){
x().then(moreStuff).then(success, error)
}
你用过它:doStuff(success, error)
你可以把它写成:
function doStuff(){
return x().then(moreStuff)
}
然后像doStuff().then(...)
一样使用它,这样可以更容易地链接,聚合和操纵承诺。
前/后的常见模式是 disposer 模式 - 例如" pre"是打开一个数据库连接和"发布"是关闭数据库连接。这可以表示为:
function withHandle(fn){
var handle;
return pre().then(function(resource){ // obtain the resource
handle = resource; // keep a handle
return resource;
}).
then(fn). // run the actual code for that resource
finally(function(){
return handle.close(); // close the resource
});
}
然后使用像:
withHandle(function(handle){
return handle.query("Give me the first user");
}).then(function(result){
// access result here, the handle is closed, can attach `catch`
});