解析 JavaScript 循环内的承诺未完成
Parse JavaScript Promises within Loop not Completing
我似乎无法理解 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 好友数组。
完成此操作的方法是使用 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();
});
结果将是一个数组数组——因为找到 returns 一个数组——作为 var-args 传递,下划线 _.toArray() 在这里很有用,即
return Parse.Promise.when(finds).then(function() {
var individualFindResults = _.flatten(_.toArray(arguments));
// and so on
我似乎无法理解 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 好友数组。
完成此操作的方法是使用 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();
});
结果将是一个数组数组——因为找到 returns 一个数组——作为 var-args 传递,下划线 _.toArray() 在这里很有用,即
return Parse.Promise.when(finds).then(function() {
var individualFindResults = _.flatten(_.toArray(arguments));
// and so on