【问题标题】:Conditional chaining of promisesPromise 的条件链
【发布时间】:2017-03-29 09:23:57
【问题描述】:

我想根据上一个电话是解决还是拒绝来链接我的承诺。我在所有承诺中都打电话给服务器。 所以,我是这样写的-

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 是否为空并忽略它。这是正确的做法吗?

我正在使用请求模块,如果我设置永远:true,我开始获取-

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

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

【问题讨论】:

  • 什么是callback(null, data)
  • @Bergi 回调函数将数据传递给控制器​​,出现错误或结果。
  • 我不明白that catch is always being called if any promise except the last one calls resolve 。你能再解释一下吗?
  • "如果除最后一个承诺之外的任何承诺调用解决,则始终调用catch。" 对我来说毫无意义。 catch 回调在最后两个 callback(null, data)apiServices.seriesSearch(id) 之一被拒绝时调用。
  • @krrish 我认为您不应该多次致电callback

标签: javascript promise npm-request


【解决方案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); 
});

【讨论】:

    猜你喜欢
    • 2020-01-17
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    相关资源
    最近更新 更多