多个ajax调用中的参数是否共享?

时间:2016-12-30 18:53:00

标签: javascript jquery asp.net ajax asp.net-mvc

我有以下javascript函数:

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。

我的意思是&#34;假设在第一次调用makeAjaxCall之后,代码的执行位于successFunction()之间,而另一个异步调用makeAjaxCall()是用不同的参数值,将值的对于successFunction()的第一次(上一次)执行,是否更改了outerParameter1和outerParameter2参数?

  1. 这样的代码(使用相同的处理程序进行多个ajax调用)是否安全?或者它会导致一些问题,例如&#34;脏读&#34;?
  2. 有人可以在技术上告诉我,这里发生了什么?多线程或其他什么,如何创建堆栈等?

    请帮助我摆脱这种混乱。

    提前致谢!

1 个答案:

答案 0 :(得分:1)

在Javascript中定义函数时,只需定义一次。当您稍后调用它们时,无论是正常(foo())还是回调(.done(foo)),都会完全独立于以前的任何调用进行处理。

对此的一个例外是在函数的外部中定义的数据。例如,如果你有:

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

在上面的代码中successFunction调用影响未来的successFunction次调用,因为whatever是在函数外定义的,因此“生活”在中间调用。但是否则你不必担心“脏读”。