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

时间:2017-10-02 14:06:54

标签: javascript angularjs promise q

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

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

1 个答案:

答案 0 :(得分:2)

从快速浏览一下,您应该能够完全删除嵌套,如下所示。请注意,如果出现错误,这将始终返回与您的代码类似的消息Request for block-range data failed.。原因是,使用$q.reject()只会跳过promise链的执行,直到下一个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);

}