2015-01-15 114 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