Bluebird Promise 重试 DocumentDB 请求

Bluebird Promise Retry DocumentDB request

本文关键字:请求 DocumentDB 重试 Promise Bluebird      更新时间:2023-09-26

我正在尝试将带有回调的重试函数重写为蓝鸟承诺函数,但似乎无法理解正确的方法。底部是工作回调函数,用于在达到限制时重试 Azure DocumentDB。我正在尝试在函数本身中使用承诺,但它在到达"然后"之前返回。有关如何解决此问题或性能是否因以这种方式使用 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);
                }
            });
        },

当你的catch回调应该处理任何事情时,它需要像其他所有 promise 回调一样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");
        }
    });
}