2017-10-02 4 views
0

Gibt es eine bessere Möglichkeit, einfach alle Fehler hier abzufangen oder da es in dieser Versprechenskette mehrere Ebenen mit mehreren Anfragen gibt, habe ich keine anderen Möglichkeiten?Behandle ich diese Versprechen richtig?

+0

Eigentlich ist diese Verschachtelung nicht notwendig. Irgendein besonderer Grund dafür? – Sirko

+2

Ich stimme für das Schließen dieser Frage als Off-Topic ab, weil es um eine Code-Überprüfung geht (und diese somit zu breit/meinungsbasiert). Es könnte wahrscheinlich angepasst werden, um für [das Code Review Stackexchange] (http://codereview.stackexchange.com/help/on-topic) Thema zu sein. – Quentin

+0

@Sirko ja eigentlich brauche ich Daten von der ersten Anfrage erhalten, um die zweite, und von der zweiten, um die dritte zu machen. – shwnrgr

Antwort

2

Von einem kurzen Blick sollten Sie in der Lage sein, die Verschachtelung ganz wie folgt zu entfernen. Beachten Sie, dass im Falle eines Fehlers die Nachricht Request for block-range data failed. immer Ihrem Code entspricht. Der Grund ist, dass die Verwendung einer $q.reject() nur die Ausführung der Versprechungskette bis zum nächsten Handler überspringt. Wenn Sie einen solchen Handler am Ende Ihres Codes platzieren, werden alle Fehler hier abgefangen.

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

Mit der neueren async/await Syntax kann man die Lesbarkeit verbessern. Diesmal wird die tatsächlich übereinstimmende Fehlermeldung zurückgegeben. (Beachten Sie, dass auch die spezifischen Fehlermeldungen mit der oberen Syntax zurückgegeben werden können).

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

Ja, ich verstehe jetzt total. Danke für dieses großartige Beispiel. Immer noch meinen Kopf um Versprechen, aber das hilft wirklich. – shwnrgr