2016-03-21 12 views
0

Ich versuche, eine Wiederholungsfunktion mit Callbacks in ein Bluebird-Versprechen neu zu schreiben, aber kann nicht scheinen, meinen Kopf um den richtigen Weg zu bekommen, dies zu tun. Unten ist die funktionierende Callback-Funktion zum erneuten Versuch von Azure DocumentDB, wenn das Limit erreicht ist. Ich versuche, Versprechungen in der Funktion selbst zu verwenden, aber es kehrt zurück, bevor das "Dann" erreicht wird. Irgendwelche Hinweise, wie man dies angehen kann oder ob die Leistung durch die Verwendung von Fang auf diese Weise beeinflusst wird, wäre wünschenswert. Vielen Dank!Bluebird Promise Retry DocumentDB Anfrage

"readDocRetry": function(id, retries) { 
       var self = this; 
       return new Promise(function(resolve, reject){ 
        self.client.readDocumentAsync(self.docsLink + id, null, function(err, data){ 
         if (err) { 
          reject(err); 
         } else { 
          resolve(data) 
         } 
        }).then(function(results) { 
         console.log("ReadDocRetry result: " + results) 
         return results; 
        }).catch(function(err, headers) { 
         RetryError(self, id, err, headers, retries); 
        }); 

       }); 
      } 

function RetryError(self, id, err, headers, retries) { 
    if (err && err.code) { 
     if (err.code === 429 && retries >= 0) { 
      setTimeout(function() { 
       self.readDocRetry(id, retries - 1); 
      }, Number(headers['x-ms-retry-after-ms'] || 1)); 
     } 
     else if (err.code === 503 && retries >= 0) { 
      setTimeout(function() { 
       self.readDocRetry(id, retries - 1) 
      }, 500); 
     } 
    } 
    else if(err) { 
     console.log(err); 
    }else{ 
     console.log("Err missing in RetryError"); 
    } 
} 


    bbCtx.readDocRetry("19").then(function(res){ 
     console.log("Hurrah!" + res); 
    }) 

------- Arbeitsbeispiel mit traditionellen Rückrufe, die ich versuche, Versprechen basiert -----

dbContext.prototype = { 
     readDocRetry: function (id, retries, cb) { 
      var self = this; 
      self.client.readDocument(self.docsLink + id, function (err, results, headers) { 
       if (err) { 
        if (err.code === 429 && retries >= 0) { 
         var aR = retries - 1; 
         setTimeout(function() { 
           self.readDocRetry(id, aR, cb); 
         }, Number(headers['x-ms-retry-after-ms'] || 1)); 
        } else if (err && err.code === 503 && retries >= 0) { 
         var aR = retries - 1; 
         setTimeout(function() { 
           self.readDocRetry(id, aR, cb) 
         }, 500); 
        } else { 
         cb(err); 
        } 
       } else { 
        cb(null, results); 
       } 
      }); 
     }, 

Antwort

0

Wenn Ihr catch Rückruf soll zu machen, ist alles zu handhaben, es muss return dieses neue Ergebnis wie jeder andere Callback-Versprechen. In Ihrem Fall könnte es das Versprechen für das Ergebnis des Wiederholungsversuchs zurückgeben:

function readDocRetry(id, retries) { 
    var self = this; 
    return new Promise(function(resolve, reject){ 
     self.client.readDocumentAsync(self.docsLink + id, null, function(err, data){ 
      if (err) { 
       reject(err); 
      } else { 
       resolve(data) 
      } 
     }); 
    }).then(function(results) { 
     console.log("ReadDocRetry result: " + results) 
     return results; 
    }).catch(function(err, headers) { 
     if (err && err.code) { 
      if (err.code === 429 && retries >= 0) { 
       return Promise.delay(headers['x-ms-retry-after-ms'] || 1).then(function() { 
        return self.readDocRetry(id, retries - 1); 
       }); 
      } else if (err.code === 503 && retries >= 0) { 
       return Promise.delay(500).then(function() { 
        return self.readDocRetry(id, retries - 1) 
       }); 
      } 
     } 
     if (err) { 
      console.log(err); 
      throw err; 
     } else { 
      console.log("Err missing in RetryError"); 
      throw new Error("rejection without error"); 
     } 
    }); 
}