2016-03-21 42 views
0

Bir Bluebird sözüne geri aramalarla yeniden deneme işlevini yeniden yazmaya çalışıyorum ama bunu yapmanın doğru yolu etrafında kafamı alamıyorum. Altta, limit karşılandığında Azure DocumentDB'yi yeniden denemek için çalışan geri arama işlevidir. Sözün kendisinde işlev kullanmaya çalışıyorum ama "O zaman" a ulaşmadan geri dönüyor. Bununla nasıl başa çıkılacağına dair herhangi bir ipucu veya bu yoldan yakalanan performanstan etkilenirse, bu şekilde takdir edilecektir. Teşekkür ederim!Bluebird Promise Yeniden Deneme BelgesiDB isteği

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

------- Sözümü yapmaya çalışıyorum geleneksel geri aramaları ile çalışma örneği ----- tabanlı

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); 
       } 
      }); 
     }, 
sizin catch geri arama şey işlemek gerekiyordu

cevap

0

, return'a ihtiyaç duyulacak ve bu, diğer tüm söz geri dönüşleri gibi yeni sonuçlara ihtiyaç duyacaktır. Durumunuzda, yeniden deneme girişiminin sonucu için söz verilebilir:

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