2012-06-03 5 views
0

겠습니까 내게 이유를 설명하는 사람의 마음을 ... 내가 만들고 여러 개체를 저장하는 가장 좋은 방법을 찾기 위해 노력하고캡슐화 문제

$(document).ready(function() { 
    var scu = ['0291285', '0409338', '0521704', '0521990', '0523652', '0523657', '0523660', '0523704']; 
    var inData = $('#output'); 
    var testdiv = $('#testdiv'); 
    function Item(scu, description, price, extended, type) { 
     this.scu = scu; 
     this.description = description; 
     this.price = price; 
     this.extended = extended; 
     this.type = type; 
     //this.saved = function() {}; 
    } 
    var rows = []; 
    function get() { 
     inData.html('');  
     $.each(scu, function(index, val) { 
      $.post('chBuild.php', {scu:val}, function(output) { 
       $.each(output, function(i, obj) { 
        var i = 0; 
        rows[i] = new Item(obj.scu, obj.description, obj.price, obj.extended, obj.type); 
        console.log(rows[i].price) 
            //this logs every object but...     

        i =+ 1; 
       }); 
      }, 'json');   
     }); 
     console.log(rows[0].price); 

      //this says rows[0] is undefined? 

    } 
    inData.click(get); 
}); 

은.

+1

'each' 안에'var i = 0'을하지 말아야합니다. 이렇게하면 모든 항목이'0'의 위치에 할당됩니다. 마지막 문장 ('i + = 1;')은 그 변수가 그 클로저 내에 만 존재하기 때문에 (즉, 반복의 모든 루프가'i'를 재정의 할 것이므로) 무의미합니다. 인자로 주어진'i'' ('function (i, obj) {')를 사용하면 정확한 결과를 얻을 수 있습니다. – mgibsonbr

+0

@mgibsonbr이 돈을 받고있다면, 여분의'var i'는 항상 0이 될 것입니다. 또한'i = + 1'을 제거하십시오. – charlietfl

답변

3
$.post('chBuild.php', {scu:val}, function(output) { 
      $.each(output, function(i, obj) { 
       var i = 0; 
       rows[i] = new Item(obj.scu, obj.description, obj.price, obj.extended, obj.type); 
       console.log(rows[i].price) 
       i =+ 1; 
      }); 
     }, 'json');   

여기서 $ .post에 대한 호출은 비동기식이며, ajax 호출이 반환 될 때 채워집니다. 어쩌면 당신은 그것을 동기화시켜야합니다

$.ajax({'url': 'chBuild.php', 'async': false, ...); 
3

$.post은 비동기식이기 때문입니다. each은 HTTP 요청 만 시작하지만 immediatly를 반환하므로 두 번째 console.log이 실행되면 항목이 아직 만들어지지 않았습니다.

+0

'$. post '뒤에 만 실행되도록하는 방법이 있습니까? – user1114060

+0

모든 itens에 대한 모든 게시물이 실행 된 후에 말입니까? JoseP가 제안한대로 요청을 동기식으로 만들 수 있습니다. 다른 방법이있을 수도 있지만, 내 머리 꼭대기에서 대답 할 수는 없습니다. – mgibsonbr