我希望将我的承诺链接起来,具体取决于之前的通话是否得到解决或拒绝。我在所有承诺中打电话给服务器。 所以,我写的就是 -
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应该在那个时候空闲。
答案 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);
});