Разбор JavaScript-обещаний в цикле не завершен

Я просто не могу поверить в обещания JavaScript.

В Parse у меня есть атрибут для пользователя, который хранит массив идентификаторов друзей Facebook. Когда новый пользователь входит в систему через 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 и Promise Chaining), за исключением того, что на этот раз мне нужны результаты асинхронного вызова, прежде чем я смогу начать обновлять массив друзей пользователя Facebook.

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 возвращает массив --passed как var-args, и здесь полезно использовать подчеркивание _.toArray(), т.е.

return Parse.Promise.when(finds).then(function() {
    var individualFindResults = _.flatten(_.toArray(arguments));
    // and so on
Другие вопросы по тегам