2015-01-22 2 views
0

У меня есть некоторые данные на parse.com, которые необходимо обновить фоновой работой. Есть около 100 сотен рядов. Обновление каждой строки использует 3 запроса parse api. Мне разрешено 30 запросов в секунду, поэтому только первые 9 строк обновляются каждый раз, когда я запускаю задание, и все пользователи, которые попадают в систему в течение этой секунды, получат ошибки.Ограничение скорости parse.com фоновые задания

Есть ли простой способ помещать паузы в задание, чтобы он обновлял строку только после 200 мс или около того, и тогда задание использует только половину доступных запросов? Это означает, что задание займет около 20 секунд, а не одну секунду, но это вполне приемлемый компромисс.

Код структурирован примерно так:

Parse.Cloud.job("UpdateData", function (request, status) { 
    Parse.Cloud.useMasterKey(); 

    (new Parse.Query("Table")) 
    .find() 
    .then(function (rows) { 
     rows.forEach(function (row) { 
     // Some queries happen here 
     ... 
     row 
      .set(...) 
      .save(); 
     }); 
     status.success(); 
    }, function (error) { 
     status.error(); 
    }); 
}); 

Я не думаю, что я могу использовать setTimeout или setInterval легко этот код (я даже не уверен, если они разрешены на parse.com облака коды). JS не поддерживает ничего подобного sleep() или wait().

+0

Вы уверены, что фоновые задания работают, как это? Я думал, что у вас есть одна работа за 20 рек/сек с другими ограничениями на работу, но не с ограничениями в соответствии с требованиями. В противном случае вышеупомянутый сценарий был бы невероятно распространен. – mbm29414

+0

Я не уверен, если это так, но моя работа заключается в поиске 168 строк, а затем только обновление первого. – rjmunro

ответ

2

Попробуйте Parse.Object.saveAll сохранить все объекты сразу, а также цепи Анализировать обещает в серии как @ mbm29414 говоря, если вам нужны другие запросы в цикле ForEach.

Следующий фрагмент кода показывает простой пример сохранения объекта сразу с Parse.Object.saveAll:

Parse.Cloud.job("UpdateData", function (request, status) { 
    Parse.Cloud.useMasterKey(); 

    (new Parse.Query("Table")) 
    .find() 
    .then(function (rows) { 
     var toSaveList = []; 
     var promise = new Parse.Promise(); 
     rows.forEach(function (row) { 
     // Some queries happen here 
     ... 
     row.set(...); 
     ... 
     toSaveList.push(row) 
     }); 
     Parse.Object.saveAll(toSaveList, function() { 
     promise.resolve(); 
     }, function() { 
     promise.reject(); 
     }); 
     return promise; 
    }) 
    .then(function() { 
     status.success(); 
    }, function() { 
     status.error(); 
    }); 
}); 
+0

Использование «saveAll» - это гораздо лучшая идея - вот что я сейчас реализовал. – rjmunro

1

Я думаю, ваша проблема в том, что вы возвращаете status.success() синхронно, вместо того, чтобы ждать завершения цикла кода.

Попробуйте (редактировался chaining Parse promises in a series):

Parse.Cloud.job("UpdateData", function (request, status) { 
    Parse.Cloud.useMasterKey(); 
    var query = new Parse.Query("Table"); 
    query.find().then(function (rows) { 
     var promise = Parse.Promise.as(); 
     _.each(rows, function(row) { 
      promise = promise.then(function() { 
       row.set(...); 
       return row.save();    
      }); 
     }); 
    }).then(function() { 
     // All got saved 
     status.success(); 

    }, function (error) { 
     // Something went wrong somewhere 
     status.error(error); 

    }); 
}); 
Смежные вопросы