2016-12-30 4 views
1

私は、次のJavaScript関数があります。複数のajaxコールのパラメータが共有されていますか?

function makeAjaxCall(outerParameter1,outerParameter2,outerDivId,paramInput){ 
    $.ajax({ 
    type: "POST", 
    url: "some time taking LargeWebMethod or url", //will take some time in giving output 
    data: "{param: " + paramInput+ "}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: successFunction 
}); 
    function successFunction(result){ 
    var innerParam1 = //some value calculated using result parameter 
    var innerParam2 = //some value calculated using result parameter 

    htmlString += //some large time consuming code using outerParameter1, outerParameter2 to generate output 

    htmlString += //some large value 

    $("#"+outerDivId).html(htmlString); 
    } 
} 

を我々はmakeAjaxCallに()を複数の呼び出しを行う大きなループを持っています。私が知っている何

for(var i=0;i<SomeLargeValue;i++){ 
    var outerParameter1; 
    var outerParameter2; 
    var id= //some div id that we want to load with some data in next ajax call 
    //some code to calculate outerParameter1 and outerParameter2 

    var paramToSend = //some value for paramInput parameter in makeAjaxCall() 

    makeAjaxCall(outerParameter1, outerParameter2, id, paramToSend) 


} 

はパラメータouterParameter1、outerParameter2、outerDivIdとparamInputはsuccessFunction()と同様にmakeAjaxCall()内(スコープで)利用可能であることです。

successFunction()内で宣言されたinnerParam1とinnerParam2は、makeAjaxCall()内でさえ、自分自身と外部のどこにも使用できません。

以下は私の疑問です。私は混乱しています: 1. makeAjaxCall()に異なるパラメータ値(大ループから)をいくつか非同期に呼び出すと、異なるプロセス(異なる呼び出しのsuccessFunction()コード)が実行されます。それらの異なるプロセスは、パラメータouterParameter1、outerParameter2、outerDivId、paramInputを共有しますか?

最初にmakeAjaxCallを呼び出した後、コードの実行はsuccessFunction()の間にあり、makeAjaxCall()への別の非同期呼び出しはさまざまなパラメータ値で行われていると仮定すると、outerParameter1と

  1. このコード(同じハンドラで複数のajax呼び出しを行う)は安全ですか、それとも「汚れた読み取り」のような問題に対応しますか?

ここで何が起こるのでしょうか?踏み台か何か、スタックはどのように作られていますか?

この混乱から抜け出すのを手伝ってください。

ありがとうございます!

+1

いいえ、それぞれのAJAX呼び出しは、あなたが渡しているパラメータ(makeAjaxCallメソッド)を取得することはありません。 – Shyju

+0

@Shyju、それは汚れた読み込みの問題を意味せず、矛盾はありませんか? –

+0

'data:" {param: "+ paramInput +"} "、'、 'JSON.stringify()'を使ってオブジェクトをJSONとしてエンコードします。JSONを手動で構築しようとしないでください。 – Barmar

答えて

1

Javascriptで関数を定義するときは、一度しか定義しません。通常(foo())かコールバック(.done(foo))のいずれかにして後で呼び出すと、それは以前の呼び出しから完全に独立して処理されます。

これの例外の1つは、関数のの外側のクロージャーで定義されたデータです。あなたが持っていた場合たとえば、:

function doSomething() { 
    var whatever = 1; 
    function successFunction() { 
     doSomethingWith(whatever); 
     changeWhatever(); 
    } 
    function changeWhatever() { 
     whatever += 1; 
    } 
} 

を上記のコードではsuccessFunction呼び出しをのでwhateverは、関数の外で定義されているため、将来successFunction通話に影響を与える、となります呼び出しの間に、「住んでいます」。しかし、そうでなければ、あなたは「汚い読書」について心配する必要はありません。

関連する問題