gpt4 book ai didi

angularjs - AngularJS Promise重试

转载 作者:行者123 更新时间:2023-12-04 16:59:59 33 4
gpt4 key购买 nike

我在重试功能正常工作时遇到了一些麻烦,希望能获得一些帮助。我有一个要调用的$ resource,直到出现成功情况或超过最大重试次数为止。

我似乎遇到的问题是,在我的重试函数中,我正在调用另一个promise,这就是检查条件的地方。通过几次重试后,删除添加的promise并创建默认的成功条件,可以使代码正常运行,但是我无法弄清楚如何正确地将新的promise调用添加到函数中。
resource是Angular $ resource的替代品,它返回$ promise

我的代码如下:

resource.$promise.then(function (response) {
return keepTrying(state, 5);
}).then(function (response) {

}).catch(function (err) {
console.log(err);
});

和keepTrying函数:
function keepTrying(state, maxRetries, deferred) {
deferred = deferred || $q.defer();
resource.$promise.then(function (response) {
success = response;
});
if (success) {
return deferred.resolve(success);
} else if (maxRetries > 0) {
setTimeout(function () {
keepTrying(state, maxRetries - 1, deferred);
}, 1000);
} else if (maxRetries === 0) {
deferred.reject('Maximum retries exceeded');
}
return deferred.promise;
}

最佳答案

尝试的问题在于,您不是在重新查询资源,而是一次又一次地对已查询资源使用Promise。

您需要做的是使用一个函数,该函数将(a)启动查询,并(b)返回该启动查询的promise。像这样的东西:

function () { return $resource.get().$promise; }

然后,您可以将其传递给类似的内容,然后进行重试。
function retryAction(action, numTries) {
return $q.when()
.then(action)
.catch(function (error) {
if (numTries <= 0) {
throw error;
}
return retryAction(action, numTries - 1);
});
}

这是开始的方式:
retryAction(function () { return $resource.get().$promise; }, 5)
.then(function (result) {
// do something with result
});

这种方法的优点是,即使传递给它的函数在调用它时抛出错误,或者根本不返回 promise ,重试功能和通过已解决的 promise 返回结果仍将起作用。

Example

关于angularjs - AngularJS Promise重试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27877626/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com