我有一个javascript脚本,我在parse.com上运行,向用户发送推送通知。我的脚本差不多完成了。现在,它会将查询设置发送到我所拥有的位置。所以这就是我现在对它的限制。
testItemsQuery.equalTo('school', 'Union College (NY)');
testItemsQuery.equalTo('meal','LUNCH');
但现在我有2个变量
var schoolArray = ['Union College (NY)', 'University of Albany'];
var mealArray = ['LUNCH','DINNER'];
我希望它也循环通过这个脚本共4次。我首先希望它为两所学校循环,然后循环每顿饭。因此,最基本的代码版本将如下所示。
var schoolArray = ['Union College (NY)', 'University of Albany'];
var mealArray = ['LUNCH','DINNER'];
for (var i = 0; i < schoolArray.length; i++) {
for (var j = 0; j < mealArray.length; j++) {
//insert all my other code here
}
}
这是我的脚本,它向parse.com发出异步请求,这就是for循环无效的原因,因为我认为我需要使用一些承诺。下面是for循环中我想要的代码:
function SendPush(installationId, msg) {
var query = new Parse.Query(Parse.Installation);
query.equalTo('objectId', installationId);
Parse.Push.send({
where: query,
data: {alert: msg}
});
}
var schoolArray = ['Union College (NY)', 'University of Albany'];
var mealArray = ['LUNCH','DINNER'];
var TestItem = Parse.Object.extend("TestItem");
var UserFavorites = Parse.Object.extend("UserFavourite");
var testItemsQuery = new Parse.Query(TestItem);
testItemsQuery.equalTo('school', 'Union College (NY)'); //I want to loop through both schools for both meals
testItemsQuery.equalTo('meal','LUNCH');
var groupedAlerts = {};
testItemsQuery.each(function(testItem) {
var item = testItem.get('item');
var school = testItem.get('school');
var userFavoritesQuery = new Parse.Query(UserFavorites);
userFavoritesQuery.include('user');
userFavoritesQuery.equalTo('item', item);
userFavoritesQuery.equalTo('school', school);
return userFavoritesQuery.each(function(userFavorite) {
//console.log(userFavorite);
var user = userFavorite.get('user');
if(user){
var instId = user.get('installation').id;
//console.log(instId);
if(!groupedAlerts[instId]) {
groupedAlerts[instId] = [];
}
var meal = testItem.get('meal').toLowerCase();
var m = userFavorite.get('item') + " is being served for " + meal + " at " + testItem.get('schoolMenu');
groupedAlerts[instId].push(m);
}
});
}).then(function () {
var alerts = [];
for(var key in groupedAlerts) {
alerts.push({
installationId: key,
alerts: groupedAlerts[key],
});
// Send push notifications
SendPush(key, groupedAlerts[key].join());
}
});
提前感谢您的帮助!!!!
答案 0 :(得分:0)
您只需要正确标记所有其他代码。如果你把它包装在一个函数中:
function schoolMealPush(school, meal) {
// Really all your other code here
}
然后在你的内部for循环中调用该函数
for (var i = 0; i < schoolArray.length; i++) {
for (var j = 0; j < mealArray.length; j++) {
schoolMealPush(schoolArray[i], mealArray[j]);
}
}
你应该做生意。不需要承诺。尽管可以使用承诺来了解所有推送完成的时间。只需返回testItemsQuery.each创建的promise,并将每个返回的promise存储在一个数组中。然后使用任何承诺库你可以做.all
var promiseArray = [];
for (var i = 0; i < schoolArray.length; i++) {
for (var j = 0; j < mealArray.length; j++) {
promiseArray.push(schoolMealPush(schoolArray[i], mealArray[j]));
}
}
bluebird.all(promiseArray)
.spread( function(){
console.log('SendPush called for all values');
});