3

バックボーンモデルで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()は機能しません。リクエストは1回だけ実行されます。

4

3 に答える 3

14

いくつかのことが間違っています。まず、この行:

setTimeout(this.ajaxRequest(),4000);

する必要があります:

setTimeout(this.ajaxRequest, 4000);

コードの最初の行はajaxRequest関数を実行し、結果(つまりundefined)をsetTimeoutに渡します。つまり、ajaxRequest関数は1回実行されますが、実行が早すぎます。後者の行は、関数自体をsetTimeoutに渡すという必要な処理を実行し、 ajaxRequest4秒後に呼び出されます。

しかし、それだけでは十分ではありません。ajaxRequest関数を実行すると、コンテキストの値がthis正しくありません。setTimeoutを呼び出すと、コールバックのコンテキストはに設定されwindowます。console.log(this)これは、コールバック関数で確認できます。

これを修正するには、関数のコンテキストをバインドする必要があります。Backboneを使用しているので、underscore.jsもすでにロードされています。_.bind oughtaを使用してそれを行います:

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

編集

そういえば、別の問題があるかもしれません。ajax呼び出しが成功または失敗すると、replyまたはproblems関数は、同じようにコンテキストが失われる可能性があります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関数を1回トリガーします。

setIntervaln各ミリ秒をトリガーします。

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

clearIntervalクリアするために使用されsetIntervalます。

clearInterval(interval);

ajaxまたは、 :にコンテキストパラメータを渡します。

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