解析循环中的JavaScript承诺未完成

时间:2015-02-15 05:31:53

标签: javascript parse-platform promise

我似乎无法掌握JavaScript承诺。

在Parse中,我有一个存储Facebook好友ID数组的用户属性。当新用户第一次通过Facebook登录时,我想要浏览使用该应用程序的Facebook好友,然后更新这些用户的Facebook好友阵列以包含这个新用户。

所以...在用户before_save中我有这个:

var friendsArray = user.get("facebookFriends");
// Iterate through all Facebook friends
_.each(friendsArray, function(facebookId){

   // Retrieve the Facebook friend user 
   var query = new Parse.Query(Parse.User);
   query.equalTo("facebookId", facebookId);

   console.log("this executes");
   query.find().then( function(){
       var user = results[0];
       // This does not execute
       console.log("Need to update " + user.get("displayName") + "'s facebook friends");
       return Parse.Promise.as();
   });
}

我的问题与我遇到的另一个问题(Parse JavaScript SDK and Promise Chaining)没有什么不同,除了这次我需要异步调用的结果才开始更新用户的Facebook好友阵列。

1 个答案:

答案 0 :(得分:1)

实现这一目标的方法是Parse.Promise.when(),当传递给它的承诺数组得以实现时,它就会实现。并且循环可以更加漂亮_.map()

var friendsArray = user.get("facebookFriends");
var findQs = _.map(friendsArray, function(facebookId){

    // Retrieve the Facebook friend user 
    var query = new Parse.Query(Parse.User);
    query.equalTo("facebookId", facebookId);

    console.log("this executes");
    return query.find();
});

return Parse.Promise.when(findQs).then(function(){
    var user = results[0];
    // This will work now
    console.log("Need to update " + user.get("displayName") + "'s facebook friends");
    return Parse.Promise.as();
});

结果将是一个数组数组 - 因为find返回一个数组 - 通过var-args,而下划线_.toArray()在这里很有用,即

return Parse.Promise.when(finds).then(function() {
    var individualFindResults = _.flatten(_.toArray(arguments));
    // and so on