我是否正确处理这些承诺



是否有更好的方法可以简单地在此处捕获所有错误,或者由于这个有望链中有多个请求的多个级别,我没有其他选择?

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

从快速浏览中,您应该能够像以下内容一样完全删除嵌套。请注意,如果发生错误,这将始终返回与您的代码相似的消息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);
}

相关内容

  • 没有找到相关文章

最新更新