2017-10-02 13 views
0

ここですべてのエラーを単に捕まえるには良い方法がありますか、複数の要求を持つこの約束のチェーンには複数のレベルがあるので、他のオプションはありませんか?これらの約束事を正しく取り扱っていますか?

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

実際にネストする必要はありません。特別な理由がありますか? – Sirko

+2

私はコードレビューを求めているので(このことはあまりにも広すぎる/意見に基づいて)、この質問を議論の対象外としている。おそらく[コードレビューstackexchange](http://codereview.stackexchange.com/help/on-topic)のトピックになるように調整することができます。 – Quentin

+0

@Sirkoはい実際に私は第二のものを作る最初の要求から得られたデータを必要とし、第二から第三のものを作るためのデータが必要です。 – shwnrgr

答えて

2

一見すると、次のように入れ子を完全に削除する必要があります。エラーが発生した場合は、コードに似たメッセージRequest for block-range data failed.が返されます。理由は、$q.reject()を使用すると、次のcatch()ハンドラまでプロミスチェーンの実行がスキップされるためです。コードの最後にこのようなハンドラを置くと、すべてのエラーがここで捕捉されます。 async/await新しい構文を使用して

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

、1は、読みやすさを向上させることができます。今回は、実際に一致するエラーメッセージが返されます。 (上の構文を使用して特定のエラーメッセージを返すこともできます)。

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

} 
+0

はい、私は完全に理解しています。この素晴らしい例をありがとう。まだ約束の周りに私の頭を包んでいるが、これは本当に役立ちます。 – shwnrgr

関連する問題