Dojo 推迟重试直到成功
Dojo deferred retry until success
我的 dojo class 中有一个方法可以发出请求(比如 JSON 一个)。如果它成功了,那就太好了。但是,如果失败(超时或其他原因),我希望它重试直到成功。为此,我在错误回调中调用方法本身:
doReq: function(){
var req = Request(...);
return req.then(function(response, io){
// Success!
}, dojo.hitch(this, function(error, io){
this.doReq(); // Failed; try again.
}));
}
我这样做正确吗?
可以通过这种方式完成,但您可能希望限制尝试次数,
例如:
doReq: function(attempts){
attempts -= 1;
var req = Request(...);
return req.then(function(response, io){
// Success!
}, dojo.hitch(this, function(error, io){
if (attempts > 0) this.doReq(attempts); // Failed; try again.
else //return some error here
}));
}
我不确定你为什么 return req.then(...)
,这将 return 新承诺而不是 req
的承诺。
但是如果你想让doReq
的调用者在req
成功时得到响应,你可以这样做。
_request: function (deferred) {
var req = Request(...);
req.then(dojo.hitch(this, function (response, io) {
// Success!
deferred.resolve(response);
}), dojo.hitch(this, function (error, io) {
this._request(deferred); // Failed; try again.
// use deferred.reject('some error message'); to reject when it reached the retry limit, if you want to.
}));
},
doReq: function () {
var deferred = new Deferred(); // from module "dojo/Deferred"
this._request(deferred);
return deferred.promise;
}
这是使用方法。
var thePromise = this.doReq();
thePromise.then(dojo.hitch(this, function (response) {
console.log('response: ', response); // your response from deferred.resolve(response);
}), dojo.hitch(this, function (error) {
console.log('error: ', error); // your error from deferred.reject('some error message'); if you have.
}));
我的 dojo class 中有一个方法可以发出请求(比如 JSON 一个)。如果它成功了,那就太好了。但是,如果失败(超时或其他原因),我希望它重试直到成功。为此,我在错误回调中调用方法本身:
doReq: function(){
var req = Request(...);
return req.then(function(response, io){
// Success!
}, dojo.hitch(this, function(error, io){
this.doReq(); // Failed; try again.
}));
}
我这样做正确吗?
可以通过这种方式完成,但您可能希望限制尝试次数,
例如:
doReq: function(attempts){
attempts -= 1;
var req = Request(...);
return req.then(function(response, io){
// Success!
}, dojo.hitch(this, function(error, io){
if (attempts > 0) this.doReq(attempts); // Failed; try again.
else //return some error here
}));
}
我不确定你为什么 return req.then(...)
,这将 return 新承诺而不是 req
的承诺。
但是如果你想让doReq
的调用者在req
成功时得到响应,你可以这样做。
_request: function (deferred) {
var req = Request(...);
req.then(dojo.hitch(this, function (response, io) {
// Success!
deferred.resolve(response);
}), dojo.hitch(this, function (error, io) {
this._request(deferred); // Failed; try again.
// use deferred.reject('some error message'); to reject when it reached the retry limit, if you want to.
}));
},
doReq: function () {
var deferred = new Deferred(); // from module "dojo/Deferred"
this._request(deferred);
return deferred.promise;
}
这是使用方法。
var thePromise = this.doReq();
thePromise.then(dojo.hitch(this, function (response) {
console.log('response: ', response); // your response from deferred.resolve(response);
}), dojo.hitch(this, function (error) {
console.log('error: ', error); // your error from deferred.reject('some error message'); if you have.
}));