Bluebird Promise重试DocumentDB请求

时间:2016-03-21 14:22:41

标签: javascript performance promise bluebird azure-cosmosdb

我试图用回调重写一个重试函数到一个蓝鸟承诺,但似乎无法理解这样做的正确方法。底部是工作回调函数,用于在满足限制时重试Azure DocumentDB。我试图在函数本身中使用promises,但它在到达"然后"之前返回。任何关于如何解决这个问题的提示,或者如果通过这种方式使用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);
                }
            });
        },

1 个答案:

答案 0 :(得分: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");
        }
    });
}