2014-12-03 3 views
0

하나의 Firebase 데이터베이스를 거쳐 기준에 일치하는 데이터베이스 항목을 찾으려고합니다. 따라서 jQuery의 지연 객체를 사용하여 데이터베이스 호출을 처리합니다.jQuery Deferred는 루프의 마지막 값만 반환합니다.

일단이 첫 번째 데이터베이스에서 반환 값을 얻으면 첫 번째 데이터베이스의 각 값에 대해 두 번째 데이터베이스에서 사용자 정보를 가져 오려고합니다. 그리고 결과는 JSON 배열

에 추가됩니다 그래서 그 :

<search for value, find one> 
<<<search other db for oher info>>> 
<continue search for outer value> 

하지만이 단지 반환 한 값 - 다른 모든 벌금을 실행 (콘솔 로그의 모든 정보를 올바른) 있지만. 나는 너희들이 수행하는 또는 내가이 문제를 해결 수있는 방법을 무엇에 어떤 아이디어가 희망

function find(searchLocation, profileID) { 

var requestUserData = { 
    data: [] 
}; 

var def = $.Deferred(); 

//This will be executed as long as there are elements in the database that match the criteria and that haven't been loaded yet (so it's a simple loop) 
Ref.orderByChild("location").equalTo(searchLocation).on("child_added", function(snapshot) { 
    def.ressolve(snapshot.val().ID); 
}); 
return def.promise(); 
}; 

:

여기에 코드입니다. 미리 감사드립니다!

편집 : 추가 테스트를 통해이 문제가 이미 외부 루프에 있음을 발견 했으므로 첫 번째 값만 반환됩니다. 이 문제는 resolve() 메서드의 위치와 관련이 있다고 생각하지만이 동작을 변경하는 방법에 대한 확실성을 찾지 못했습니다.

+0

루프에서'notify'가 완료되면'resolve'가됩니다. – Johan

+0

이렇게하면 쿼리가 처음 실행되기 전에 resolve()가 실행되어 반환되는 빈 객체가 생깁니다. – chrissik

+3

자세히 알아 보려면 다음을 수행하십시오. 결과 집합의 길이. 완료된 각 항목에 대해'notify()'. 집합의 전체 길이에 도달하면 지연된 객체를'resolve()'합니다. – Johan

답변

1

파이어베이스는 실시간 데이터베이스입니다. 서버에서 변경 사항이 발생하면 이벤트 스트림이 발생합니다. 이 실시간 모델을 CRUD 전략에 적용하고 데이터에 대해 GET 작업을 수행하려고합니다. 더 나은 솔루션은 수정 된 값을 실시간으로 간단히 업데이트하는 것입니다.

좋아하는 바인딩 프레임 워크에서이를 수행하는 방법에 대한 예제는 AngularFire, ReactFire 또는 BackboneFire를 참조하십시오. 당신은 데이터의 정적 스냅 샷을 검색 할 경우

직접, 당신은 child_added에서 value 이벤트가 아닌 실시간 스트림에 한 번() 콜백 사용하려면, 질문에 대답하려면 :

Ref.orderByChild("location").equalTo(searchLocation).once("value", function(snapshot) { def.resolve(snapshot.val()); });

관련 문제