2016-03-21 114 views
0

我試圖用回調重寫一個重試函數到一個藍鳥承諾一個,但似乎無法讓我的頭正確的方式做到這一點。底部是在滿足限制時重試Azure DocumentDB的工作回調函數。我試圖在函數本身中使用promise,但它在到達「Then」之前返回。值得讚賞的是,如何解決這個問題或者如果以這種方式使用catch來影響性能,我們將不勝感激。謝謝!藍鳥承諾重試DocumentDB請求

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

-------與我試圖做出承諾的傳統回調的工作例如基於-----

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

回答

0

當你catch回調應該處理任何事情,它需要像return那樣的新結果,就像其他的承諾回調一樣。在你的情況下,它可能會返回對重試嘗試結果的承諾:

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