0

我想根据之前的电话是解决还是拒绝来链接我的承诺。我在所有承诺中都打电话给服务器。所以,我写它就像 -

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);
});

由于every then 返回一个promise 对象,问题是如果除了最后一个promise 之外的任何promise 调用resolve,catch 总是被调用。我在想的一种方法是检查 err 是否为空并忽略它。这是正确的方法吗?

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

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

永远是假的,它有效。为什么我的套接字在请求结束后仍然很忙?由于只有在调用拒绝时才会进行下一个请求,所以到那时套接字应该是空闲的。

4

1 回答 1

1

你应该只调用callback一次。不要在每个承诺之后将其作为 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); 
});
于 2017-03-29T10:18:52.693 回答