Javascript - 使用promises运行for-loop

时间:2014-09-21 21:44:00

标签: javascript for-loop parse-platform promise

我有一个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());
    }
});

提前感谢您的帮助!!!!

1 个答案:

答案 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');
  });