2015-01-15 3 views
3

Parse promise chain 주위에 머리가 있다고 생각하지만, 내가 이해할 수없는 것은 함수에서 데이터를 반환하는 방법입니다 (i) 약속 체인을 백업하고 (ii) 뒤로 내 원래 JS 코드의 호출 메소드.Parse promise chain에서 데이터 리턴하기

아래 코드를 사용하면 첫 번째 Parse 쿼리가 호출 된 다음 a() 및 b()가 모두 정상적으로 호출됩니다. 각 단계의 console.log는 테스트 용이며 체인이 순서대로 실행되었음을 보여줍니다.()하는 방법은()와 기능 B (다시 함수의 데이터를받을 수 있나요

  1. ) 그래서 주요 기능 getUserCompetitionTokens에 액세스 할 수 있습니다

    지금은 3 개 질문이?

  2. getUserCompetitionTokens()에서이 파싱 코드를 호출 한 주 프로그램으로 데이터를 반환하려면 어떻게해야합니까?

  3. 데이터를 함수 a()와 함수 b()에서 모두 주 프로그램으로 반환하려면 어떻게해야합니까?


function getUserCompetitionTokens(comp_id) { 
    Parse.initialize("****","****"); 
    currentUser = Parse.User.current(); 

    user_competition = Parse.Object.extend("UserCompetition"); 
    var user_comp_query = new Parse.Query(user_competition); 
    user_comp_query.equalTo("UserParent", currentUser); 
    user_comp_query.find().then(a).then(b); 

    function a(user_comp_results) { 

     var no_results = user_comp_results.length; 
     var id = user_comp_results[0].id; 
     console.log("User Competition Output: " + no_results + " results found, first item id: " + id); 

     var Competition = Parse.Object.extend("Competition"); 
     var query = new Parse.Query(Competition); 
     return query.get(comp_id, { 
      success: function(competition) { 
       console.log("COMP - " + competition.id); 
      }, 
      error: function(competition, error) { 
       console.log(error); 
      } 
     }); 
    } 

    function b(competition) { 

     var Competition = Parse.Object.extend("Competition"); 
     var query = new Parse.Query(Competition); 
     query.get(comp_id, { 
      success: function(competition) { 
       console.log("COMP 2 - " + competition.id); 
      }, 
       error: function(competition, error) {console.log(error);} 
     }); 
    } 
} 
+0

'query.get()'은 다소 매끄러운 방법입니다. 대신에'query.find()'를 사용할 수 있습니까? –

답변

5

당신은반환 :

미안 해요, 그건 전문적에 농담입니다 하지 않는 : 당신이 볼, 약속은 할 수있는 방법이다 비동기 동작. 그래서 당신은 엄격히 말하면, return 함수의 값을 얻을 수 없습니다.

그러나 이미 각 단계의 결과를 정확하게 파악하고 있습니다 ... 당신은 자신을 사용할 수 있다는 것을 깨닫지 못했습니다.

대답은 고객님의 then 처리기를 사용하는 것입니다.

user_comp_query.find().then(a).then(b).then(function(results){ 
    console.log(results); // Hooray! 
}); 

그러나, 약속 실패 있음을 유의하십시오. 따라서 오류가있을 때마다 호출되는 두 번째 처리기를 전달하는 것이 중요합니다.

var handleSuccess = function (results) {}; 
var handleFailure = function (error) {}; 
var parsePromise = user_comp_query.find().then(a).then(b); 
parsePromise.then(handleSuccess, handleFailure); 
+0

대단히 유용한 답변입니다. @firstdoiit 감사합니다. 당신은 아마도 이것에 걸릴 수 있습니다 ... http://stackoverflow.com/questions/32768731 – Fattie

+0

정말 고마워요! 이 전에 ParsePromise로 할 일을 알지 못했습니다. –