Разобрать JavaScript SDK и Promise Chaining
Я создал фоновое задание в Parse Cloud Code, которое отправляет уведомления по электронной почте на основе даты в одном из моих классов Parse.
Вот идея: запрос к классу, который содержит дату. Переберите каждый возвращенный объект и проверьте поле даты. Если дата совпадает с сегодняшней, отправьте уведомление по электронной почте, измените дату на ноль и сохраните ее для анализа.
Однако, похоже, что не все объекты сохраняются обратно в Parse. Я подозреваю, что это проблема с моими цепочками обещаний, но мне трудно диагностировать точную проблему или как ее исправить. Ниже приведен соответствующий код
Parse.Cloud.job("job", function(request, status) {
// Query for all users
var query = new Parse.Query(className);
query.each(function(object) {
if (condition) {
object.set(key, false);
object.save(null, {
success:function(object){
// This never executes!
},
error: function(error){
}
}).then(function(){
// This never executes
console.log("Save objects successful");
},
function(error){
status.error("Uh oh, something went wrong saving object");
});
// Set hiatus end successful
Mailgun.sendEmail({
});
}
});
});
Эта линия console.log("Save objects successful");
в цепочке обещаний objects.save() никогда не выполняется, даже когда объект подписки успешно сохраняется в Parse.
Кроме того, если по запросу возвращено более 5 объектов, только первые 5 успешно сохраняются обратно в Parse. Любые дополнительные сохранения не выполняются и уведомления по электронной почте не отправляются.
1 ответ
Я бы очистил это следующим образом, полагаясь на Promise.when ...
var savePromises = []; // this will collect save promises
var emailPromises = []; // this will collect email promises
// your code to setup the query here
// notice that this uses find() here, not each()
query.find(function(subscriptions) {
_.each(subscriptions, function(subscription) { // or a for loop, if you don't use underscore
// modify each subscription, then
savePromises.push(subscription.save());
// prepare each email then
var emailPromise = Mailgun.sendEmail({ /* your email params object here */ });
emailPromises.push(emailPromise);
});
// now do the saves
return Parse.Promise.when(savePromises);
}).then(function() {
// now do the emails
return Parse.Promise.when(emailPromises);
}).then(function() {
// Set the job's success status
status.success("Subscriptions successfully fetched");
// and so on with your code
Вы можете также рассмотреть возможность объединения сохранений и электронных писем в один большой массив обещаний, но, возможно, было бы лучше сделать это двумя партиями последовательно, так как они имеют разные режимы сбоев.