2017-01-18 1 views
0

Ich habe versucht herauszufinden, wie man das Wiederholen von z. ein fehlgeschlagener Download mit Versprechen. Meine beste Vermutung ist, ein Versprechen mit einem neuen Versprechen zu lösen (siehe den Pseudocode unten), aber alles, was ich in der Dokumentation finden konnte, ist, dass Promise.resolve() mit einem thenable (und so, glaube ich, mit einem Versprechen) aufgerufen werden kann). Gilt dies auch für den Auflösungs-Callback im Promethe-Konstruktor? Ist meine Vorgehensweise korrekt oder gibt es eine bessere Möglichkeit, eine Wiederholung durchzuführen?Wie man ein Versprechen in ES6 erneut versucht

function getdata(url) { 
    return new Promise(function(resolve, reject) { 
     ajaxcall({ 
     url: url, 
     success: function(data) { resolve(data); }, 
     failure: function(err) { 
      if(retriable(err)) { 
       resolve(getdata(url)); 
      } 
      else { 
       reject(err); 
      } 
     } 
     }); 
    }); 
} 
+0

Das ziemlich einfach ist, herauszufinden: 'neue Promise (resolve => resolve (Promise.resolve (42))) dann (v => console.log (v));' Protokolle. '42', kein Versprechen. Also ja, es scheint auch mit "Entschlossenheit" zu funktionieren. –

+0

Generic Versprechen Retry-Helfer 'var retry = Fn => _ => Fn(). Catch (Wiederholung (Fn));' –

+1

generische begrenzte Anzahl von Versprechen Wiederholungen 'var retryP = (Fn, Retry) => Fn(). catch (err => retry> 0? retryP (fn, retry - 1): Promise.reject (err)); ' –

Antwort

3

Ihr Ansatz würde funktionieren. Wenn ein Versprechen an den Auflösungsrückruf des Promise-Konstruktors übergeben wird, wird der Auflösungswert dieses Versprechens als Auflösungswert der "äußeren" Zusage verwendet.

Es könnte sauberer sein, ajaxcall in einer Versprechen zurückkehrenden Funktion zu wickeln, so dass Sie Versprechen und Rückrufparadigmen nicht mischen und zusammenpassen.

function fetch(url) { 
    return new Promise(function(resolve, reject) { 
    ajaxcall({ 
     url: url, 
     success: resolve, 
     failure: reject 
    }); 
    }); 
} 

function getdata(url) { 
    return fetch(url) 
    .catch(function(err) { 
     if(retriable(err)) { 
     return getdata(url); // or fetch(url) to retry only once 
     } else { 
     throw err; 
     } 
    }); 
} 
+0

Beachten Sie, dass dies unter modernen Regeln als fehlerhafter Code gekennzeichnet werden könnte, da das innere 'Fetch' keine Fehlerbehandlung hat und JS-Engines dazu ermutigt werden, Versprechungen zu verbieten, die Fehler im void verschwinden lassen . Sie könnten 'getdata (url)' wieder zurückgeben, anstatt 'fetch (url)' –

+0

@Mike'Pomax'Kamermans könnten Sie bitte eine Ressource ausarbeiten oder zeigen, wo diese Regel erwähnt wird? Wer würde das "flagging" machen? Ein Linter? –

+0

Die Motoren selbst. Zum Beispiel wird die Version von V8, die derzeit von Node.js verwendet wird, wenn sie 'new Promise (function (resolve, reject) {new error ('test');})' '' Warnt 'UnhandledPromiseRejectionWarning: Unhandled speak rejection 'sagen (Zurückweisungs-ID: 2): Fehler: Test'. In diesem speziellen Fall verlieren wir durch das Aufrufen von 'fetch' anstelle von' getdata' die Fähigkeit, Fehler zu sehen (und damit umzugehen), die nichts mit dem anfänglichen Fehler zu tun haben (z. B. ein Hardware-Fehler, der einen Netzwerkfehler verursacht) zweiter Versuch) –

-1

Sie können Ihren Code ändern, um die interne Funktion in Promise aufzurufen. Etwas wie folgt aus:

function getdata(url) { 
    return new Promise(function(resolve, reject) { 
    function call() { 
    return ajaxcall({ 
      url: url, 
      success: function(data) { resolve(data); }, 
      failure: function(err) { 
      if(retriable(err)) { 
       call(); 
      } 
      else { 
       reject(err); 
      } 
      } 
     }); 
    } 
    call(); 
    }); 
} 
Verwandte Themen