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.
}));