我是否正确地处理了这些承诺?

Am I handling these promises correctly?

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

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

快速浏览一下,您应该能够完全删除嵌套,如下所示。请注意,如果出现错误,这将始终 return 消息 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语法,可以提高可读性。这次实际匹配的错误信息是returned。 (请注意,也可以 return 使用上层语法的特定错误消息)。

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

}