我的dojo类中有一个方法可以发出请求(例如,一个JSON)。如果成功,那就好了。但是,如果它失败(超时或其他),我希望它再试一次,直到成功为止。为此,我在错误回调中调用方法本身:
doReq: function(){
var req = Request(...);
return req.then(function(response, io){
// Success!
}, dojo.hitch(this, function(error, io){
this.doReq(); // Failed; try again.
}));
}
我这样做是否正确?
答案 0 :(得分:1)
可以这样做,但你可能想限制尝试,
例如:
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
}));
}
答案 1 :(得分:0)
我不确定你为什么要返回req.then(...)
,这将返回新的承诺,而不是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.
}));