Разобрать 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

Вы можете также рассмотреть возможность объединения сохранений и электронных писем в один большой массив обещаний, но, возможно, было бы лучше сделать это двумя партиями последовательно, так как они имеют разные режимы сбоев.

Другие вопросы по тегам