Dojo推迟重试直到成功

时间:2018-02-09 09:27:08

标签: javascript dojo

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

我这样做是否正确?

2 个答案:

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