收集一组发布请求返回的数据并发布另一个请求

时间:2013-03-08 13:16:02

标签: jquery database post asynchronous each

我在jQuery中有一个哈希。它叫做dict。

要填充该哈希值,我调用createDict()函数,该函数将返回如下所示的内容,

{“12 | 345”=> “http://www.one.com”, “67 | 890”=> “http://www.two.com”}

var dict = createDict();    

现在对于散列的每个元素,我执行“grabData”方法,这只是一个post请求,

    $.each(dict, function( key, value ) { 

      data = key.split("|")[0];    

      var a = "";        

      //Calling the function that is a post request.
      grabData(data,"/url",function(returned) {   

          alert(returned); //=> Positive              

          a = returned;

      });

      alert(returned); // => negative

      alert(a); // => negative

    });

//定义grabData

function grabData(input,url,callback){

    $.post(url,input,function(data){                    

          $("div#answer").html(data);

          callback(data); 
     });

}

问题:

  1. 对于dict哈希中的每个元素,我执行一个组帖子 请求并获取返回值并更新 “分区#答案”。

  2. 我想在另一个数组或哈希中收集返回的值     运行另一个单一的post请求,其输入将是此数组或     散列。

    注意:

  3.   

    第二个单发帖请求将更新数据库,所以我       不希望在第一组帖子请求期间发生这种情况。

2 个答案:

答案 0 :(得分:1)

首先找到您要触发的请求总数(即dict中的元素数)。这样您就可以为每个请求设置一个计数器并继续增加,并且在最终请求时,您可以收集数据并发出一个帖子请求。

var total = dict.length;

设置计数器

var counter = 0;
var returnedData = [];

然后运行你的每个循环

$.each(dict, function( key, value ) { 
//your loop settings

...
   //Calling the function that is a post request.
      grabData(data,"/url",function(returned) {   

          alert(returned); //=> Positive              

          a = returned;
      returnedData .push(returned);
      counter++;
      if(counter == total ){
        //Collect the returned value, which will be in `returnedData` array.
        //make post request with collected data
      }
 });
});

答案 1 :(得分:1)

您需要将运行POST的代码放入回调函数中,并检查每次回调函数运行时是否拥有所需的所有数据。类似的东西:

function grabData(input,url,callback){
    var allDataSoFar = [];
    $.post(url,input,function(data){                    
        $("div#answer").html(data);
        allDataSoFar.push(data);
        if (haveGotAllDataYet(allDataSoFar){
             $.post(...)
        }
    });
}