【问题标题】:Bluebird Promise Retry DocumentDB requestBluebird Promise 重试 DocumentDB 请求
【发布时间】:2016-07-08 02:40:40
【问题描述】:

我正在尝试将带有回调的重试函数重写为 Bluebird 承诺函数,但我似乎无法理解正确的执行方式。底部是满足限制时重试 Azure DocumentDB 的工作回调函数。我正在尝试在函数本身中使用 Promise,但它会在到达“Then”之前返回。任何有关如何解决此问题的提示,或者以这种方式使用 catch 是否会影响性能,我们将不胜感激。谢谢!

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

【问题讨论】:

    标签: javascript performance promise bluebird azure-cosmosdb


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      • 2015-09-30
      • 1970-01-01
      • 2016-11-30
      相关资源
      最近更新 更多