【问题标题】:Parse JavaScript SDK and Promise Chaining解析 JavaScript SDK 和承诺链
【发布时间】:2016-08-24 04:57:44
【问题描述】:

我在 Parse Cloud Code 中创建了一个后台作业,它根据我的 Parse 类中的一个日期发送电子邮件通知。

思路如下:查询包含日期的类。遍历返回的每个对象并检查日期字段。如果日期等于今天,则发送电子邮件通知,将日期更改为 null 并将其保存回 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({
        });
    }

    });
});

objects.save() 承诺链中的这一行 console.log("Save objects successful"); 永远不会被执行 - 即使订阅对象成功保存到 Parse。

此外,如果查询返回的对象超过 5 个,则只有前 5 个成功保存回 Parse。不会执行任何额外的保存,也不会发送电子邮件通知。

【问题讨论】:

    标签: javascript parse-platform promise parse-cloud-code


    【解决方案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
    

    您也可以考虑将保存和电子邮件合并为一大堆承诺,但最好分两批依次执行,因为它们具有不同的失败模式。

    【讨论】:

    • 为什么 return Parse.Promise.when(savePromises); 来自 .each() 回调?
    猜你喜欢
    • 2015-10-03
    • 2015-07-03
    • 2015-05-05
    • 2018-11-03
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 2014-09-16
    相关资源
    最近更新 更多