gpt4 book ai didi

javascript - 有条件的 promise 链

转载 作者:行者123 更新时间:2023-12-03 04:41:02 26 4
gpt4 key购买 nike

我想根据之前的调用是否得到解决或拒绝来链接我的 promise 。我正在向服务器发出所有 promise 。所以,我这样写-

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

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

我正在使用请求模块,如果我设置为forever: true,我开始得到-

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

使用永远错误,它可以工作。为什么即使请求结束后我的套接字仍然繁忙?由于只有在调用reject时才会进行下一个请求,因此此时套接字应该是空闲的。

最佳答案

您应该只调用回调一次。不要在每个 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 的代码中调用任何回调,因此仅当您必须与遗留代码交互时才使用此回调。否则,不要采用回调参数,而只是返回 promise :

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

关于javascript - 有条件的 promise 链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43089460/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com