$ .getJSON with for循环,只是在调试时工作

时间:2016-09-21 12:37:20

标签: javascript jquery getjson

**我真的需要帮助,因为我无法找到合适的解决方案,也不能靠自己来做。问题是,我无法获得信息。 “数据”应包括23个对象。问题是,虽然调试一切运行良好。请帮我!!!我快要结束了。和回调,或者。(功能...)对我不起作用......;(**

function query_day2day(DateArray_){

        var Fluid_id = 0;
        var data_list = new Array();

    //read out the select element
        var e = document.getElementById("select_fluid");
        var Fluid_id = e.options[e.selectedIndex].value;
    //read in date
        //var d = document.getElementById("datepicker");
        //var date = d.value;
        var dateArray = new Array();
        dateArray = DateArray_;
    //Bring the date array in the correct form to submit
        for(i = 0; i<dateArray.length; i++)
        {
        var year = dateArray[i].substring(6, 10);   //substring(start, end)
        var month = dateArray[i].substring(0, 2); 
        var day = dateArray[i].substring(3, 5);  

        dateArray[i] = year + "-" + month + "-" + day;
        //alert(dateArray[i]);
        }

        for(i = 0; i<dateArray.length; i++)
        {
        switch (Fluid_id) {
            case '1':
               $.getJSON(setAddress_Event() + 'liter_hour/' + Fluid_id + '/' + dateArray[i], function(data){


                //data_callback(data, i); //I don´t understand this concept ;(
               data_list[i] = data;     


                });
                break;
            case '2':
               $.getJSON

更新

        function getData(setAddress_Event, liter_hour, Fluid_id, dateArray){
          return $.getJSON(setAddress_Event + liter_hour + Fluid_id + "/" + dateArray).then(function(data){
            return {
              data_list:data
            }
          });
        }

        for(var j = 0; j<dateArray.length; j++)
        {
        getData(setAddress_Event(), "liter_hour/", Fluid_id, dateArray[j]).then(function(returndata){
          //received data!
          alert(j);
          data_collection[j] = returndata;

        });

        }


    alert(data_collection); //Hier ist data_list undefined und beim returnen wird es richtig übergeben.... ohne diesem alert wird falsch übergeben.... dreck
    return data_collection;

请帮助我,我需要的所有数据不仅仅是最后一个。调试工作,我不知道这里有什么问题....

Debugg Snippet

2 个答案:

答案 0 :(得分:1)

这是因为您在检索JSON的Ajax请求已发回响应之前访问数据。执行

时请注意
    getData(setAddress_Event(), "liter_hour/", Fluid_id, dateArray[j]).then(function(returndata){
      //received data!
      alert(j);
      data_collection[j] = returndata;
    });

...内部函数未执行。它只传递给getData,您的代码会立即继续。只有当执行到达脚本结束时,Ajax才会逐个请求调用你的回调函数,所以它们都会在主脚本结束后执行。

以下是处理该问题的方法(引入变量numPendingResults):

var numPendingResults = dateArray.length;
for(let j = 0; j<dateArray.length; j++) {
    getData(setAddress_Event(), "liter_hour/", Fluid_id, 
                                dateArray[j]).then(function(returndata){
      //received data!
      data_collection[j] = returndata;
      numPendingResults--; // one less to wait for!
      if (!numPendingResults) { // we have everything!
        console.log(data_collection);
        // anything you want to do with data_collection should be done here
        // ...
        // or call a function that will deal with it, from here.
      }
    });
}

您无法退回data_collection。相反,你应该调用如上所述的函数。可能该函数可以作为最外层函数的参数传递。或者进一步使用Promise系统。你决定......

答案 1 :(得分:0)

尝试类似的东西。您可能需要循环遍历元素才能使用它们。

                $.getJSON('/ReferenceData/PhoneType',
            function (data) {
                if (!isBound) {
                    dropDownToBind.append($('<option></option>').val(-1).html('- Select Type -'));
                    $.each(data, function (index, element) {
                        dropDownToBind.append($('<option></option>').val(element['Id']).html(element['Value']));
                    });
                    isBound = true;
                }
            });

//或者这个

                                $.getJSON(url, params, function (data) {
                                    if (data != null) {
                                        zip_code_field.closest('.formCol').find('.ZipCity').val(data.City);
                                        zip_code_field.closest('.formCol').find('.ZipState').val(data.State);

                                        $.uniform.update();
                                    }
                                });