承诺的有条件链接

时间:2017-03-29 09:23:58

标签: javascript promise npm-request

我希望将我的承诺链接起来,具体取决于之前的通话是否得到解决或拒绝。我在所有承诺中打电话给服务器。 所以,我写的就是 -

apiServices.patientsSearch(id)
.then(function(data){
    return callback(null,data);
},function(err){
    return apiServices.studiesSearch(id);
}).then(function(data){
    return callback(null,data);
},function(){
    return apiServices.seriesSearch(id); 
}).then(function(data){
    return callback(null,data);
})
.catch(function(err){
    return callback(false,err);
});

每当然后返回一个promise对象,问题是如果除了最后一个调用之外的任何promise都解析,则始终会调用catch。我想的一种方法是检查err是否为空并忽略它。这是正确的方法吗?

我正在使用请求模块,如果我永远设置:是的,我开始得到 -

{ [Error: socket hang up] code: 'ECONNRESET' }

永远是假的,它有效。为什么即使请求结束后我的套接字仍然处于忙碌状态?因为下一个请求只有在调用reject时才会发生,所以socket应该在那个时候空闲。

1 个答案:

答案 0 :(得分:1)

您只应拨打callback一次。不要在每个promise之后将它作为onfulfilled-handler传递,最后调用一次:

apiServices.patientsSearch(id).then(null, function(err){
    return apiServices.studiesSearch(id);
}).then(null, function(){
    return apiServices.seriesSearch(id); 
}).then(function(data){
    callback(null,data);
}, function(err){
    callback(false,err);
});

apiServices.patientsSearch(id).catch(function(err){
    return apiServices.studiesSearch(id);
}).catch(function(){
    return apiServices.seriesSearch(id); 
}).then(function(data){
    callback(null,data);
}, function(err){
    callback(false,err);
});

当然,你不应该在基于promise的代码中调用任何回调,所以只有在必须与遗留代码接口时才使用它。否则,请不要使用callback参数,只需return承诺:

return apiServices.patientsSearch(id).catch(function(err){
    return apiServices.studiesSearch(id);
}).catch(function(){
    return apiServices.seriesSearch(id); 
});