2012-02-03 15 views
1

私は2つの機能を持っていますが、1つの機能は、データを取得するためのajax Web呼び出しを行うリロード機能です。もう1つはデータをロードするアイテムローダです。問題は、ajax呼び出しのためにデータ項目をロードする関数がまだ値になっていないことです。とにかくsetTimeoutを呼び出す以外にこれを修正しますか?助けを前にありがとう。javascript競合状態の問題

function reload(index) { 
    _ListData[index] = null; 
    DisplayInformation.GetTemplateTableInformation(
     ListManager.listReportId(), 
     ListManager.listParameters(), 
     ListManager.listSortParams(), 
     TableReportHelper_TemplateRelatedAction, 
     reloadRange.min, 
     reloadRange.num, 
     function(templateItemIfo) {//success callback causes issues with race conditon in the function itemLookaheadCallback because _ListData[index] = null; 
      itemLookaheadCallback(templateItemIfo, index); 
     }); 
} 

ここでは、「成功コールバック」内の項目をロードするためのコードを入れて

function loadDataCallback(lookAheadData, index, loadNeighbors) { 
    //Store the received value 
    var item = _ListData[index];//this will be null because of _ListData[index] = null; 
    item.data = lookAheadData.TemplateInformation; 

}; 
+1

コードを減らして質問に不可欠なものにすることはできますか? –

+0

+1以上。コンテキストがありません。より一般的な方法でこの問題を説明してください。 –

+0

申し訳ありませんが、コードを少し減らしました。var item = _ListData [index]; nullになり、問題です。関数reloadコールバックitemLookaheadCallbackはインデックス項目を十分に速く設定しません。 – user516883

答えて

2

リロードコールバックで呼ばれていた項目をロードしようとする機能です。

また、AJAXコールを同期させることもできますが、遅い接続や大量のデータの場合はページが凍結しているように見えるため、これは避けてください。

-1

ajax呼び出しでasync = Falseを使用すると、同期呼び出しを行うことができます。

$.ajax({ 
      type: 'GET', 
      url: '/yourUrl/', 
      dataType: 'json', 
      success: function(data) { 

      }, 
      data: {}, 
      async: false 
     }); 

p.s .:ここでAjaxを呼び出すためにjQueryを使用します。

+0

[**決して同期AJAX呼び出しを行いません。](http://stackoverflow.com/a/7337091/201952) – josh3736

+0

@ josh3736なぜですか?説明無しにこのような決定的な声明を決してしないでください! – Sid

+0

リンクをクリックします。同期コールはブラウザのUIをフリーズしますが、これは恥ずかしいほど悪いUXです。 – josh3736

0

私はこれが競合状態のように見えますが、私は手足に出て、実際に範囲の問題であることを示唆しています。

_ListDataの関数の中にあり、コールバックが正しくスコープを継承していて、それを1レベル深くアクセス可能にする可能性があります。

function reload(index) { 
    _ListData[index] = null; 
    ... 
} 

しかし、(あなたがやっている可能性があるように見える)、コールバックのコールバックは、おそらくその範囲を失うと完全に匿名スコープに存在しています。

reload -> itemLookaheadCallback -> loadDataCallback 

解決策はありますか?windowを使用して、その変数のグローバルにアクセス可能な場所を定義することを検討してください。 (windowは常にグローバルです)。それはただの推測ですが、

function reload(index) { 
    window._ListData[index] = null; 
    ... 
} 

function loadDataCallback(lookAheadData, index, loadNeighbors) { 
    var item = window._ListData[index]; 
    ... 
}; 

とにかく:ここ

はそれが起こるになるだろう変化です。おそらく間違っていますが、確認するのは比較的簡単です。