【问题标题】:Am I handling these promises correctly?我是否正确处理了这些承诺?
【发布时间】:2017-10-02 23:05:49
【问题描述】:

有没有更好的方法来简单地捕获这里的所有错误,或者由于这个承诺链中有多个级别以及多个请求,我没有其他选择?

        return RequesterService.get('peakBlockIndex', request)
            .then(function(res) {
                rangeData = res.data;
                rangeData.intervals = [];
                if (!rangeData.intervals || rangeData.intervals <= 0) {
                    return $q.reject({ message: 'Request returned no interval data.' });
                }

                return SiteService.getSite(rangeData.site.id)
                    .then(function(site) {
                        if (!site.zoneId) {
                            return $q.reject({ message: 'Request for zoneId failed for the given site.' });
                        }

                        return getDayAheadData(site.zoneId, start, end)
                            .then(function(data) {
                                return handleBlockRange(rangeData, data[0].data, data[1].data);
                            })
                            .catch(function(err) {
                                return $q.reject({ message: 'Request for cleared & forecasted data failed for the given site.' });
                            })
                    })
                    .catch(function(err) {
                        return $q.reject({ message: 'Request for zoneId failed for the given site.' });
                    })
            })
            .catch(function(err){
                return $q.reject({ message: 'Request for block-range data failed.' });
            });
        }

【问题讨论】:

  • 其实嵌套是没有必要的。有什么特殊原因吗?
  • 我投票决定将此问题作为离题结束,因为它要求进行代码审查(因此这太宽泛/基于意见)。它可能会被调整为the code review stackexchange 的主题。
  • @Sirko 是的,实际上我需要从第一个请求中获得的数据来制作第二个,然后从第二个请求中获得第三个。
  • @ShawnRieger 这解释了多个调用,但不解释嵌套本身。乍一看,这可能都在同一个嵌套级别上。
  • 其他一些旁注:如果出现错误,您当前总是返回相同的错误消息(最后一个)。我不确定,如果这真的是你的意图。

标签: javascript angularjs promise q


【解决方案1】:

快速浏览一下,您应该可以完全移除嵌套,如下所示。请注意,如果出现错误,这将始终返回与您的代码类似的消息Request for block-range data failed.。原因是,使用$q.reject() 只会跳过承诺链的执行,直到下一个catch() 处理程序。当您在代码末尾放置这样一个处理程序时,所有错误都将在此处捕获。

return RequesterService.get('peakBlockIndex', request)
      .then(function(res) {
          rangeData = res.data;
          rangeData.intervals = [];
          if (!rangeData.intervals || rangeData.intervals <= 0) {
              return $q.reject({ message: 'Request returned no interval data.' });
          }

          return SiteService.getSite(rangeData.site.id)
      })
      .then(function(site) {
          if (!site.zoneId) {
              return $q.reject({ message: 'Request for zoneId failed for the given site.' });
          }

          return getDayAheadData(site.zoneId, start, end);
      })
      .then(function(data) {
          return handleBlockRange(rangeData, data[0].data, data[1].data);
      })
      .catch(function(err){
          return $q.reject({ message: 'Request for block-range data failed.' });
      });

使用较新的async/await 语法,可以提高可读性。这次返回的是实际匹配的错误信息。 (注意,也可以使用上面的语法返回特定的错误消息)。

async function someRequest( request ){

  let res;
  try{
    res = await RequesterService.get('peakBlockIndex', request);
  } catch(e){
    return $q.reject({ message: 'Request for block-range data failed.' });
  }

  rangeData = res.data;
  rangeData.intervals = [];
  if (!rangeData.intervals || rangeData.intervals <= 0) {
    return $q.reject({ message: 'Request returned no interval data.' });
  }

  let site;
  try {
    site = await SiteService.getSite(rangeData.site.id);
  } catch(e) {
    return $q.reject({ message: 'Request for zoneId failed for the given site.' });
  }

  if (!site.zoneId) {
    return $q.reject({ message: 'Request for zoneId failed for the given site.' });
  }

  let data;
  try{ 
    data = getDayAheadData(site.zoneId, start, end);
  } catch(e){
    return $q.reject({ message: 'Request for cleared & forecasted data failed for the given site.' });
  }

  return handleBlockRange(rangeData, data[0].data, data[1].data);

}

【讨论】:

  • 是的,我现在完全明白了。感谢这个很好的例子。仍然围绕着承诺,但这真的很有帮助。
猜你喜欢
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 2021-02-03
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 2020-02-19
相关资源
最近更新 更多