2016-09-21 6 views
0

** 실제 해결책을 찾거나 내 스스로 할 수 없기 때문에 도움이 정말로 필요합니다. 문제는 정보를 얻을 수 없다는 것입니다. "데이터"에는 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; 

제발 도와주세요, 내가 필요로하는 모든 데이터를하지 단지 마지막. 디버깅 내가 문제가 여기 what's 알고하지는 작품 ....

Debugg Snippet

답변

1

   $.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; 
       } 
      }); 

// OR입니다. 실행시주의하십시오.

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 시스템을 한 단계 더 사용하십시오. 결정할 당신을 위해 ...

+0

멋지게 완료 한 의견을 많이 주셔서 감사합니다! 그런 전문적인 솔루션 :) 하지만 여전히 거의 같은 문제가 있습니다. for 루프가 완료되면 console.log에 다음과 같이 표시됩니다. 배열 [<3 개의 자유 위치>, 객체] 개체는 오늘부터의 데이터이므로 앞에있는 3 개의 개체가 여기에 없습니다. ?? –

+0

실제로 문제가 있습니다. then-callback이 실행될 때까지 * j * 변수는 이미 배열 길이에 도달했기 때문에 결과는 모두 같은 배열 요소에 저장됩니다. 이를 해결하는 한 가지 방법은 루프 변수 * j *를'var' 대신'let'으로 선언하는 것입니다. 그런 식으로 각 반복에는 * j *라는 자체 인스턴스가 있습니다. 그에 따라 코드를 수정했습니다. – trincot

+0

내가 말했듯이, 당신은 왕 이십니다! 작동합니다. 내가 100 표를 줄 수 있다면 불행히도 나는 할 수 없습니까 ?? ^^ 배열 [개체, 개체, 개체, 개체, 개체] !!!!!!! 예 –

0

이와 비슷한 것을 시도해보십시오. 요소를 사용하려면 요소를 반복해야 할 수도 있습니다. 당신이 JSON을 검색하기위한 Ajax 요청하기 전에 데이터가 응답을 다시 전송 한 액세스 때문에

       $.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(); 
            } 
           }); 
+0

thx. 빠른 코멘트. 비동기식 데이터 전송 때문에 타이밍 문제가있는 것 같습니다. 오늘은 충분합니다. 나는 집에 간다. 내 머리가 화상 .... 나중에 참조 –