2014-09-08 3 views
1

입력 배열에서 전화 번호와 일치하는 전화 번호를 가진 사용자를 찾으려고합니다. 그러나 나는 userQuery가 완료되기 전에 response.success(friends);이 호출되고 있다고 생각합니다. 현재 데이터로는 2 명의 사용자를 반환해야하지만 현재 작성된대로 빈 배열 만 반환합니다. 성공 응답을 userQuery (단순히 테스트하기 위해)에 넣으면 사용자가 다시 생겨서 쿼리가 옳다는 것을 알게됩니다. 다른 내포 된 약속이 필요합니까?중첩 된 약속을 구문 분석 하시겠습니까?

Parse.Cloud.define("addFriends", function(request, response) { 
    var _ = require('underscore.js'); 
    Parse.Cloud.useMasterKey(); 

    var friends=[]; 

    var theNumbers = request.params.phoneNumbers; 
    var userId = request.params.user; 


    var currentUserQuery = new Parse.Query("User"); 
    currentUserQuery.equalTo("objectId", userId) 
    currentUserQuery.first().then(function(currentUser) { 
     var promise = Parse.Promise.as(); 


     _.each(theNumbers, function(aNumber) { 
      promise = promise.then(function() { 
       console.log('looking for: ' + aNumber); 

       userQuery = new Parse.Query("User"); 
       userQuery.equalTo("phoneNumber", aNumber); 
       userQuery.first().then(function(foundUser){ 
        console.log("Found user: " + foundUser); 

        friends.push(foundUser); 
       }); 
      }); 

      return promise; 
     }); 
    }).then(function(){ 
     console.log('done'); 
     response.success(friends); 
    }); 
}); 

답변

1

모든 하위 약속을 배열 친구에게 추가하고 Parse.Promise.when으로 새로운 약속을 반환하십시오. response.successarguments을 반환해야합니다. Parse.Promise.when은 배열이 아닌 인수 당 하나의 결과를 반환하기 때문입니다.

Parse.Cloud.define("addFriends", function(request, response) { 
    var _ = require('underscore.js'); 
    Parse.Cloud.useMasterKey(); 

    var friends=[]; 

    var theNumbers = request.params.phoneNumbers; 
    var userId = request.params.user; 


    var currentUserQuery = new Parse.Query("User"); 
    currentUserQuery.equalTo("objectId", userId) 
    currentUserQuery.first().then(function(currentUser) { 


     _.each(theNumbers, function(aNumber) { 
      console.log('looking for: ' + aNumber); 

      userQuery = new Parse.Query("User"); 
      userQuery.equalTo("phoneNumber", aNumber); 
      friends.push(userQuery.first()); 
     }); 
     return Parse.Promise.when(friends); 
    }).then(function(){ 
     console.log('done'); 
     response.success(arguments); 
    }); 
}); 
+0

완벽하게 작동합니다. 훌륭한 방법은 "인수"또는 친구 배열에 푸시 될 때 반환되는 정보를 필터링하거나 사용자 정의 할 수 있습니까? 현재 깨끗한 객체 대신 많은 메타 데이터를 가지고 있습니다. –

+0

'then' 콜백에서 그렇게합니다. 'response.success' 전에 청소하십시오. – wayne

0

당신은 문제가 해결 될 때까지 다음 .then 통화 대기를 만들기 위해 약속을 반환해야합니다.

Parse.Cloud.define("addFriends", function(request, response) { 
    var _ = require('underscore.js'); 
    Parse.Cloud.useMasterKey(); 

    var friends=[]; 

    var theNumbers = request.params.phoneNumbers; 
    var userId = request.params.user; 


    var currentUserQuery = new Parse.Query("User"); 
    currentUserQuery.equalTo("objectId", userId) 
    currentUserQuery.first().then(function(currentUser) { 
     var promise = Parse.Promise.as(); 


     _.each(theNumbers, function(aNumber) { 
      promise = promise.then(function() { 
       console.log('looking for: ' + aNumber); 

       userQuery = new Parse.Query("User"); 
       userQuery.equalTo("phoneNumber", aNumber); 
       userQuery.first().then(function(foundUser){ 
        console.log("Found user: " + foundUser); 

        friends.push(foundUser); 
       }); 
      }); 

      return promise; 
     }); 

     // This is where you return the promise, to delay the call to response.success 
     return promise; 

    }).then(function(){ 
     console.log('done'); 
     response.success(friends); 
    }); 
});