vic*_*ele 3 javascript jquery json backbone.js
如何在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
});
}
Run Code Online (Sandbox Code Playgroud)
});
或者我尝试过:
setTimeout(function(){
//ajax code
},4000);
Run Code Online (Sandbox Code Playgroud)
但结果是一样的.setTimeout()不起作用.请求只运行一次.
jev*_*lio 14
有些事情是不对的.首先,这一行:
setTimeout(this.ajaxRequest(),4000);
Run Code Online (Sandbox Code Playgroud)
应该:
setTimeout(this.ajaxRequest, 4000);
Run Code Online (Sandbox Code Playgroud)
第一行代码执行ajaxRequest函数并将结果(即undefined)传递给setTimeout.这意味着该ajaxRequest函数将执行一次,但过早.后一行做你想要的,即将函数本身传递给setTimeout,并ajaxRequest在4秒后调用.
但这还不够.当ajaxRequest执行功能时,的值this上下文不正确.当您调用setTimeout时,回调的上下文设置为window.您可以console.log(this)在回调函数中验证这一点.
要修复它,您需要绑定函数的上下文.既然你正在使用Backbone,你也已经加载了underscore.js.使用_.bind oughta:
setTimeout(_.bind(this.ajaxRequest, this), 4000);
Run Code Online (Sandbox Code Playgroud)
编辑:
想想看,可能还有另外一个问题.当ajax调用成功或失败时,reply或者problems函数可能会遭受与上下文相同的丢失ajaxRequest.但如果有,它很容易修复.
_.bind最简单的方法是在Backbone模型构造函数中调用_.bindAll,而不是调用它们.
initialize: function() {
_.bindAll(this, 'ajaxRequest', 'reply', 'problems');
}
Run Code Online (Sandbox Code Playgroud)
当您调用时_.bindAll,下划线保证每次调用模型中列出的任何方法时,this上下文变量都指向模型本身,除非特别绑定到其他内容.
| 归档时间: |
|
| 查看次数: |
7131 次 |
| 最近记录: |