JavaScript中的Ajax只发送数组中的最后一个数据

时间:2013-07-12 16:51:50

标签: javascript json ajax http-post

我想用JavaScript中的json ajax从我的应用程序发送数据。我有多个数据包,但是当我通过ajax发送数据时,它只发送最后一个数据包。

例如,我发送两个数据包,然后ajax发送两个数据包,但它们都包含相同的数据(最后一个数据包)。

这是我的代码。

    for(var i=0;i<data.length;) {
            /*var d = new Date();
            d.setTime(data[i].updated);*/
var send2 = {};
    send2.nama= data[i].name;
    send2.rumahsakit = data[i].hospital;

    //step 1
    alert("step 1"+send2.nama);


var client = "coba";
var Idku = data[i].unik;
//clientID
var request2 = {};
request2.jsonrpc = "2.0";
request2.id = "load_reg"+Idku+"";
request2.method = "registrasi:loadByClientUnik";
request2.params = [client,Idku];
//request2.params = akun.value;

var postData = JSON.stringify(request2);

var postArray  = {json:postData};   


$.ajax({
    type: 'POST',
    url: 'service.php',
    data: postArray,
    dataType:'json',
    //async: false,
    success: function(result){      
    alert(send2.nama);
    //alert step 2; 

    if(result.result == -1){
    //alert("-1 cuk");
    var requestx = {};
    requestx.jsonrpc = "2.0";
    requestx.id = "store_reg";
    requestx.method = "registrasi:store";
    requestx.params = [send];

    var postDatax = JSON.stringify(requestx);

    var postArrayx  = {json:postDatax};

    $.ajax({
    type: 'POST',
    url: '/service.php',
    data: postArrayx,
    dataType:'json',
    //async: false,
    success: function(result){
    //alert("sukses");
    },
    error: function(e){
    console.log(e);
    alert(e);
    }       });

    }else{
    alert(send2.nama);
    var request = {};
    request.jsonrpc = "2.0";
    request.id = "store_reg";
    request.method = "registrasi:storeById";
    request.params = [result.result,send2];

    var postData2 = JSON.stringify(request);

    var postArray2  = {json:postData2};

    $.ajax({
    type: 'POST',
    url: '/service.php',
    data: postArray2,
    dataType:'json',
    //async: false,
    success: function(result){
    //send2 = "";
    //alert("sukses ID");
    },
    error: function(e){
    console.log(e);
    alert(e);
    }
    });

    }
    },
    error: function(e){
        console.log(e);
        alert(e);
    }

}); 
//return false;
i++;
}
getData();
}

示例行为:我发送2个数据包,第1个名称= 1,第2个名称= 2,然后我发送两个数据包:

输出:

  • 提醒步骤1打印1

  • 警告步骤1打印2

  • 警告步骤2打印2

  • 警告步骤2打印2

我想要这个输出:

  • 提醒步骤1打印1

  • 警告步骤2打印1

  • 警告步骤1打印2

  • 警告步骤2打印2

        }else{
    alert(send2.nama);
    var request = {};
    request.jsonrpc = "2.0";
    request.id = "store_reg";
    request.method = "registrasi:storeById";
    request.params = [result.result,send2];
    
    var postData2 = JSON.stringify(request);
    
    var postArray2  = {json:postData2};
    
    $.ajax({
    type: 'POST',
    url: 'http://10.126.14.116/portable_med_services/service.php',
    data: postArray2,
    dataType:'json',
    //context set
    context: { send2: send2 },
    //async: false,
    success: function(result){
    //send2 = "";
    //alert("sukses ID");
    },
    error: function(e){
    console.log(e);
    alert(e);
    }
    });
    

这是我添加上下文的更新代码...我是对吗?

更新:

我已在此问题后解决了此问题... jQuery ajax inside a loop problem

1 个答案:

答案 0 :(得分:0)

您的代码实际上是按顺序一个接一个地发送两个请求(步骤1),就像您可能想要的那样。

由于$ .ajax()调用的异步特性,您获得了第一个调试输出。他们发送请求并继续执行代码 - 它们不会阻塞,也不会等待服务器的响应。这就是为什么你的外部/主要for循环在收到任何响应之前一直执行到最后(在你的情况下是2次)并且执行成功回调中的代码。

当收到2个响应时,将执行成功回调(2次,每次响应一次),但是在那个时间点,本地变量send2.nama的值为“2”。这就是为什么你输出“step 2 print 2”两次,而不是“step 2 print 1”和“step 2 print 2”。

这可能也是您在成功回调中发出的其他请求的错误原因,因为您在回调中使用了局部变量。您应该使用context参数:

$.ajax({
  // ...
  context: { send2: send2 },
  success: function (result) {
    // "this" has the value of the context object
    alert(this.send2.nama);
    // ...
  }
});

我不确定你的意图是否真的只发送第二个请求 已收到第一个响应,但如果是,那么你将不得不重新编码代码并发送来自第一个请求的成功回调内部调用的函数的第二个请求。