【问题标题】:Javascript - run for-loop with promisesJavascript - 使用 Promise 运行 for 循环
【发布时间】:2014-09-21 21:44:00
【问题描述】:

我有一个在 parse.com 上运行的 javascript 脚本,它向用户发送推送通知。我的脚本几乎完成了。现在它会发送一个带有查询集的推送到我拥有它的地方。所以这是我现在对它的限制。

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());
    }
});

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

【问题讨论】:

  • 如果您只是将代码放入循环中,什么不起作用?您希望异步步骤按顺序运行还是并行运行?

标签: javascript for-loop parse-platform promise


【解决方案1】:

您只需要在此处正确定义您标记的 // 我所有其他代码的范围。如果你把它包装在一个函数中:

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 创建的承诺并将每个返回的承诺存储在一个数组中。然后使用任何你可以做的承诺库 .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');
  });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-30
    • 2020-07-27
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 2016-12-13
    • 2022-10-14
    • 1970-01-01
    相关资源
    最近更新 更多