如何在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()不起作用。请求只运行一次。
答案 0 :(得分:14)
有些事情是不对的。首先,这一行:
setTimeout(this.ajaxRequest(),4000);
应该是:
setTimeout(this.ajaxRequest, 4000);
第一行代码执行ajaxRequest函数并将结果(undefined
)传递给setTimeout。这意味着ajaxRequest
函数将执行一次,但过早。后一行执行您想要的操作,即将函数本身传递给setTimeout,并在4秒后调用ajaxRequest
。
但这还不够。执行ajaxRequest
函数时,this
上下文的值不正确。当您调用setTimeout时,回调的上下文设置为window
。您可以在回调函数中通过console.log(this)
验证这一点。
要修复它,您需要绑定函数的上下文。既然你正在使用Backbone,你也已经加载了underscore.js。使用_.bind oughta:
setTimeout(_.bind(this.ajaxRequest, this), 4000);
修改:
想想看,可能还有另一个问题。当ajax调用成功或失败时,reply
或problems
函数可能会遇到与ajaxRequest
相同的上下文丢失。但是,如果有,它很容易修复。
最简单的方法是在你的Backbone模型构造函数中调用_.bindAll,而不是在那些上调用_.bind
。
initialize: function() {
_.bindAll(this, 'ajaxRequest', 'reply', 'problems');
}
当您调用_.bindAll
时,下划线保证每次调用模型中列出的任何方法时,this
上下文变量都指向模型本身,除非特别绑定到其他内容。 / p>
答案 1 :(得分:0)
您不需要做任何特殊的事情就可以将setTimeout
与骨干一起使用。检查this
功能中reply
的范围。我猜它this.ajaxRequest()
不在范围内。
答案 2 :(得分:0)
您必须改为使用setInverval
。
setInterval(this.ajaxRequest, 4000);
setTimeout
触发该功能一次。
setInterval
触发每个n
毫秒。
var interval = setInterval(this.ajaxRequest, 4000);
clearInterval
用于清除setInterval
。
clearInterval(interval);
或者在ajax
上传递上下文参数:
$.ajax({
...
context: this,
...
});