Разбор 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