首页 文章

承诺的有条件链接

提问于
浏览
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);
});

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

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

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

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

1 回答

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

    当然,你不应该 callback 参与 return 承诺:

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

相关问题