我刚刚开始使用nodeJS,我尝试熟悉promises。
我有下面的代码,对我来说,可以通过移动 retry 逻辑并将其放在getValue2中来改进它。
重试逻辑与getValue2不同。
问题在于,一旦我将逻辑放入方法中,getValue2就会在retryGetValue2的promise完成之前完成。
理想情况下,我想保持在线 sendPriceResponse(res,res2); 并摆脱if-else
有什么建议吗?
这是代码:
getValue1(link).then( function(res)
{
getValue2(link2).then(function(res2)
{
if(res2==='') // retry logic <===---------------|
{ //|
retryGetValue2(link2).then(function(res2new)//|
{ //|
sendPriceResponse(res, res2new); //|
}); //|
} //_________________|
else
{
sendPriceResponse(res, res2);
}
});
});
getValue2看起来像:
function getValue2(link)
{
return getInfo(link); // returns a promise
}
答案 0 :(得分:2)
您的重试逻辑可以很简单:
const getInfoRetry = link => getInfo(link).then(res => res ? res : getInfoRetry(link));
这不仅会重试一次,而且会得到有效的响应。现在就做:
getInfoRetry(link1).then(res =>
getInfoRetry(link2).then(res2 =>
sendPriceResponse(res, res2)
)
);
您还可以并行获取它们:
Promise.all([getInfoRetry(link1), getInfoRetry(link2)])
.then(([res, res2]) => sendPriceResponse(res, res2));
答案 1 :(得分:1)
您应将诺言链接在一起,以避免诺言作为回调的反模式,从而导致缩进。而是return
Promise
链中的每个res
。
除了等待Promise
解析(例如getValue2)
)之外,还希望传递值(例如Promise.all
)时,请使用Promise.all
类似地,在下一个函数中,您可以使用res
来传递retryGetValue2
和res2
或{{1 }},具体取决于res2
是否为假:
getValue1(link)
.then((res) => Promise.all([res, getValue2(link2)]))
.then(([res, res2]) => Promise.all([
res,
res2 || retryGetValue2(link2)]
))
.then(([res, verifiedRes2]) => {
sendPriceResponse(res, verifiedRes2);
});
如果res2
可能是假的,但不是空字符串,那么您将不得不使用条件运算符而不是||
:
Promise.all([
res,
res2 === '' ? retryGetValue2(link2) : res2
])
答案 2 :(得分:-1)
const getValue2WithRetry = (link) => {
return getValue2(link).then((res2) => {
if(res2 === ''){
return getValue2WithRetry(link);
}else{
return res2;
}
});
}