2015-01-15 141 views
3

我想我已經得到了解析承諾鏈的頭,但我不明白的是我如何從函數返回數據(i)備份承諾鏈和(ii)返回到我原來的JS代碼的調用方法。從解析承諾鏈返回數據

使用下面的代碼,調用第一個Parse查詢,然後a()和最後b(),這一切都很好。每個階段的console.log都用於測試目的,並顯示鏈已按順序執行。

我現在有3個問題:

  1. 我如何將數據從功能回()和函數B()這樣我就可以在主函數getUserCompetitionTokens訪問它()?

  2. 如何將getUserCompetitionTokens()中的任何數據返回到調用此解析代碼的主程序?

  3. 如果我想從函數a()和函數b()到BOTH的數據返回到我的主程序,該怎麼辦?


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()'來代替嗎? – 2015-01-16 01:11:21

回答

5

:)

對不起,這只是一個技術性笑話:你看,諾言是一種方式表示異步行爲。所以你不能,嚴格地說,抓住返回值的一個函數。

但是,您已經正確地抓取每一步的結果......您只是沒有意識到您可以自己使用它。

答案是使用你自己的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 2015-09-25 12:16:08

+0

非常感謝!在此之前不知道該如何處理ParsePromise – 2015-10-25 01:17:06