3

如何在 Backbone 模型中使用 setTimeout()?我有下一个代码:

var ContentModel = Backbone.Model.extend({
URL: "http://localhost/example.php",    
requestType: "POST",
dataType: "json",
data: "", //Set the value outside the model

startSend: function (Data) { 
           //
},
reply: function (Data) { 
    var dataJson = eval(Data);              
    console.log(dataJson);
    setTimeout(this.ajaxRequest(),4000);
},
problems: function (Data) { 
    //
},
ajaxRequest: function () {
    $.ajax({
        async:true,
        type: this.requestType,
        dataType: this.dataType, 
        url: this.URL,
        data: this.data,
        beforeSend:this.startSend,
        success: this.reply,
        timeout:4000,
        error:this.problems 
    });

}       

});

或者我试过:

setTimeout(function(){
               //ajax code
               },4000);

但结果是一样的。setTimeout() 不起作用。该请求只运行一次。

4

3 回答 3

14

有几件事不对劲。首先,这一行:

setTimeout(this.ajaxRequest(),4000);

应该:

setTimeout(this.ajaxRequest, 4000);

第一行代码执行 ajaxRequest 函数并将结果(即undefined)传递给 setTimeout。这意味着该ajaxRequest函数将执行一次,但太快了。后一行做你想做的事,就是将函数本身传递给 setTimeout,并ajaxRequest在 4 秒后调用。

但这还不够。ajaxRequest执行函数时,this上下文的值不正确。当您调用 setTimeout 时,回调的上下文设置为window. console.log(this)您可以在回调函数中验证这一点。

要修复它,您需要绑定函数的上下文。由于您使用的是 Backbone,因此您还已经加载了 underscore.js。使用_.bind 应该这样做:

setTimeout(_.bind(this.ajaxRequest, this), 4000);

编辑

仔细想想,可能还有其他问题。当 ajax 调用成功或失败时,replyorproblems函数可能会遭受与ajaxRequest之前相同的上下文丢失。但如果有,它很容易修复。

除了调用_.bind这些,最简单的方法是在 Backbone 模型构造函数中调用_.bindAll

initialize: function() {
  _.bindAll(this, 'ajaxRequest', 'reply', 'problems');
}

当您调用 时_.bindAll,下划线保证每次调用模型中列出的任何方法时,this上下文变量都会指向模型本身,除非特别绑定到其他东西。

于 2013-01-08T00:09:30.803 回答
0

你不需要做任何特别的事情来使用setTimeout主干。检查函数this中的范围。reply我猜这this.ajaxRequest()不在范围内。

于 2013-01-07T23:57:44.097 回答
0

你必须setInverval改用。

setInterval(this.ajaxRequest, 4000);

setTimeout触发一次函数。

setIntervaln每毫秒触发一次。

var interval = setInterval(this.ajaxRequest, 4000);

clearInterval用来清除setInterval

clearInterval(interval);

或者在您的 : 上传递上下文参数ajax

$.ajax({
    ...
    context: this,
    ...
});
于 2013-01-07T23:57:58.730 回答