2017-01-18 1 views
1

Ich muss mehrere Versuche auf die asynchrone Funktion getDBfileXHR, aber ich weiß nicht, wie Sie damit umgehen. Ich bin wirklich neu zu verketten Versprechen so brauche ich Sie, geduldig zu sein;) Soll ich sie wie diese Kette:Wie eine asynchrone Funktion mehrere Male versuchen, mit Versprechen, .then(), .Catch()

return getDBfileXHR(dbUrl(), serverAttempts) 
    .then(function() { // success 
     console.log('-basic XHR request succeeded.'); 
     return dbReadyDeferred.promise; 
    }) 
    .catch(function(){ 
     return getDBfileXHR(dbUrl(), serverAttempts) 
     .then(function(){ 
      console.log('-basic XHR request succeeded after second attempt.'); 
      return dbReadyDeferred.promise; 
     }) 
     .catch(function() { // error 
      console.log("-basic XHR request failed, falling back to local DB file or localStorage DB..."); 
      return fallbackToLocalDBfileOrLocalStorageDB(); 
     }); 
    }) 

oder so:

return getDBfileXHR(dbUrl(), serverAttempts) 
.then(function() { // success 
    console.log('-basic XHR request succeeded.'); 
    return dbReadyDeferred.promise; 
}) 
.catch(function(){ 
    if (typeof serverAttempts !== "undefined") serverAttempts++; 
    console.log('on passe dans le catch, serverAttempts = ', serverAttempts) 
    if (serverAttempts < 2) { 
     return getDBfileXHR(dbUrl(), serverAttempts) 
     .then(function() { // success 
      console.log('-basic XHR request succeeded.'); 
      return dbReadyDeferred.promise; 
     }) 
     .catch(function(){ 
      console.log("-basic XHR request failed, falling back to local DB file or localStorage DB..."); 
      return fallbackToLocalDBfileOrLocalStorageDB(); 
     }) 
    } else { 
     console.log("-basic XHR request failed, falling back to local DB file or localStorage DB..."); 
     return fallbackToLocalDBfileOrLocalStorageDB(); 
    } 
}) 

Dieser zweite Code scheint zu funktionieren, aber Ich bin mir nicht sicher, ob es sich um Best Practices handelt.

Danke für Ihre Hilfe!

+0

Mögliche Duplikat [Versprechen Retry Design Patterns] (http://stackoverflow.com/questions/38213668/promise (retry-design-patterns) –

+0

Es ist nicht die gleiche Syntax in dieser Frage, ich weiß nicht, wie ich mich mit meinem Fall identifizieren soll. – Louis

+0

benötigt "getDBfileXHR" ** wirklich das Argument serverAttempts, und ist es 0 oder 1? –

Antwort

0

Eine einfache und flexible Lösung beinhaltet einen Helfer zu schaffen - Nutzen, wieder verwendbar für alles, was retrying Versprechen erfordert:

var retryP = (fn, retry) => fn(retry).catch(err => (!isNaN(retry) && retry > 0) ? retryP(fn, retry - 1) : Promise.reject(err)); 

Diese generische Funktion fn für höchstens attempts einige Male wiederholen wird, 1 vorbei einmal erneut versuchen machen, das heißt zwei Versuche

Ihre Funktion dann geschrieben werden kann:

var serverAttempts = 1; 
// this is should be the retry attempts, 
// so 0 is try at most once, 1 is at most twice etc 

// argument n will be the number of retries "in hand", 
// so it counts down from the passed in value to 0 
return retryP(n => getDBfileXHR(dbUrl(), serverAttempts - n), serverAttempts)   
    .then(() => { 
     console.log('-basic XHR request succeeded after second attempt.'); 
     return dbReadyDeferred.promise; 
    }) 
    .catch(() => { 
     console.log("-basic XHR request failed, falling back to local DB file or localStorage DB..."); 
     return fallbackToLocalDBfileOrLocalStorageDB(); 
    }); 

Wenn y ou sind nicht zufrieden mit ES2015 + Syntax
Helfer:

var retryP = function retryP(fn, retry) { 
    return fn(retry).catch(function (err) { 
     return !isNaN(retry) && retry > 0 ? retryP(fn, retry - 1) : Promise.reject(err); 
    }); 
}; 

Code:

var serverAttempts = 1; 

return retryP(function (n) { 
    return getDBfileXHR(dbUrl(), serverAttempts - n); 
}, serverAttempts) 
.then(function() { 
    console.log('-basic XHR request succeeded after second attempt.'); 
    return dbReadyDeferred.promise; 
}) 
.catch(function() { 
    console.log("-basic XHR request failed, falling back to local DB file or localStorage DB..."); 
    return fallbackToLocalDBfileOrLocalStorageDB(); 
}); 
Verwandte Themen