承诺代码审查

时间:2018-07-29 06:16:55

标签: javascript node.js

我刚刚开始使用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
} 

3 个答案:

答案 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来传递retryGetValue2res2或{{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;
    }
  });
}