2015-01-02 5 views
0
다음

에 inisde 루프 찾기 기능의 실행 뒤에 논리를 설명하는 것은 코드입니다구문 분석

기본적으로
function f1() { 
    for (var i = 0; i < arr.length; i++) { 
    var query = new Parse.Query("Group"); 
    query.equalTo("parent", arr[i]); 
    var position = pos[i]; 
    alert("pos[i] = " + pos[i] + " position = " + position); 
    query.find({ 
     success: function(users) { 
     if (users.length === 0) { 
      alert("in if"); 
     } else { 
      alert("in else"); 
     } 
     } 
    }); 
    } 
} 

, 그룹은 구문 분석 클래스는, 도착은 클래스 Parse.User의 객체를 포함하고 POS 배열입니다 정수를 저장합니다. 이제는 8, 15 및 arr에 두 개의 값을 포함하고 i = 0 users.length! = 0 및 i = 1, users.length = 0에 대해 두 개의 정수가 포함됩니다. 기본적으로이 함수가 output

pos[i] = 8 position = 8 
in else 
pos[i] = 15 position = 15 
in if 

그러나 actaully,이 얻을 : : 난입니다 원하는

pos[i] = 8 position = 8 
pos[i] = 15 position = 15  // I don't know why i am getting this, it is irritating me 
in else 
pos[i] = 15 position = 15 
in if 

인터넷과 Google에서이 문제에 관해 검색했지만 더 나은 해결책을 찾을 수 없습니다. 원하는 출력을 얻는 방법은?

+1

파스 APi 호출은 비동기입니다. 데이터가 반환되기 전에 루프가 완료됩니다. 정확히 그 문제가 무엇인지 명확히 밝히지 않았다. – charlietfl

+0

나는 게시물을 편집했다. 기본적으로 내가하고 싶은 것은 모든 사용자를 반복 한 다음 부모 (포인터)가이 사용자를 가리키고 인쇄하는 것이다. 그 그룹 개체의 이름 필드를 콘솔 그래서 내가 찾은 내에서 찾을을 사용했다 –

+0

당신이 뭘하려고하는지 전혀 모르십시오. 경고가 예상 된 순서대로 실행됩니다.이러한 종류의 디버깅에는 경고를 사용하지 마십시오. 콘솔 – charlietfl

답변

0

참고 : 디버깅을 위해 alert을 사용하지 마십시오. 상황이 발생할 때의 영향으로 오도됩니다. 거의 언제나 브라우저에 내장 된 디버거를 사용하려고합니다. 심지어 타이밍이 엉망인 경우에는 console.log을 통해 기록하십시오. 루프가 완료되면

그러나 여기에서 주요 문제는 query.find 통화의 작품 비동기 인 것입니다, 그것은의 success 기능 나중에 호출합니다. 당신은 찾을 수 있었는지 위치를 알고 싶다면

, 당신은 당신의 success 콜백 정보를 결합하고 출력 할 수 있습니다 :

var position = pos[i]; 
    query.find({ 
     // Note first arg v 
     success: function(pos, users) { 
      if (users.length === 0) { 
       console.log("in if, pos = " + pos); 
      } else { 
       console.log("in else, pos = " + pos); 
      } 
     }.bind(null, position) // *** Note bind 
    }); 

Function#bind이라는 새로운 "바인딩"기능을 반환 주어진 this 값 (위 사용되지 않으므로 초기 값은 null)으로 원래 함수를 호출 한 다음 bind에 전달 된 인수를 바인드 된 함수에 전달합니다.

그래서 여기에 간단한 예제, 까다로운 조금 파악 될 수

: 당신이 엄격한 순서대로 수행하려는 경우

function foo(a, b) { 
 
    snippet.log("a = " + a + ", b = " + b); 
 
} 
 
var f = foo.bind(null, 'one'); 
 
f('two'); // Shows a = one, b = two
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>


, 당신은 기다릴 필요가 다음 통화를 시작하기 전에 한 통화를 완료해야합니다.

+0

사용하기 이것은 작동했지만, 임의의 방식으로 작동합니다. 처음에는 콘솔에 15 번 인쇄 된 후 8 번과 그 반대의 경우가 있었습니까? –

+0

@jain : 아마 * random *이 아니지만, 일부 쿼리는 전에 시작된 쿼리보다 빨리 완료 될 수 있습니다. 이를 원하지 않으면 이전 쿼리에서 성공한 콜백을 얻을 때까지 후속 쿼리를 시작하지 마십시오. –

+0

어떻게 그럴 수 있습니까? 좋은 설명을 주셔서 감사합니다 ... –

0
var queries = []; 

    for (var i = 0; i < arr.length; i++) { 
     var query = new Parse.Query("Group"); 
     query.equalTo("parent", arr[i]); 
     var position = pos[i]; 
     alert("pos[i] = " + pos[i] + " position = " + position); 
     queries.push(query.find()); 
    } 
    Parse.Promise.when(queries).then(function() { 
     var users = Array.prototype.slice.call(arguments); 
     // users will contain the results of each query in corresponding positions 
    }); 

아이디어가이 비동기 찾을 완료 약속을 반환) (찾을 수 있으며, Promise.when()는 약속의 때를 모두 충족있어 약속을 반환 (3210)는 다음과 같이 Promise.when()를 사용하는 것을 고려 합격은 완료되었습니다.

+0

나는 TypeError를 얻고있다 : a는 정의되지 않는다 ... :(queries.push (query.find())에;) 이유를 모른다? –

+0

그것은 가능한가? 이 코드와 관련이 없습니까? – danh

관련 문제