【问题标题】:parse.com A Cloud Job of few wordsparse.com 几句话的云作业
【发布时间】:2014-08-05 10:43:40
【问题描述】:

我正在尝试在 parse.com 上创建一个简单的云作业,但它的行为不符合预期。

作业返回没有错误,但在此过程中,我正在执行一个查找查询,该查询似乎被扔到了空白处。没有错误,我的 console.log 在执行 query.find() 之前是可见的,但之后什么都没有……查询似乎静默失败。

这是我的代码:

Parse.Cloud.job("maintenanceJob", function(request, status) {

    return performMaintenanceTasks().then(function() { 
       status.success("Parse Job done");
    }, function(errors) {
        status.error(tools.prettifyError(errors));
    });

});


function performMaintenanceTasks ()
{
    // If we have more than NB_MAX_ITEMS objects in Items, let's delete some
    var query = new Parse.Query(Items);
    return query.count({
      success: function(count) {
        if(count > NB_MAX_ITEMS) {
            return deleteOldItems(1); // 1 is used for test
        } 
        return Parse.Promise.as("Nothing to do.");
      },
      error: function(error) {
        return Parse.Promise.error(error);
      }
    });

}

function deleteOldItems(nbToDelete) {

    // (...)

    var query = new Parse.Query(Items);
    query.ascending("createdAt");
    query.limit(nbToDelete);
    query.include("rawData");

    console.log("I am visible in console, but NOTHING AFTER ME. query.find() seems to return immediately"); 

    return query.find({
        success: function (results) {
            // I never pass here
            var promise = Parse.Promise.as();

            _.each(results, function (item) {

                // For each item, extend the promise with a function to delete it.
                promise = promise.then(function () {

                    var rawData = item.get("rawData");

                    // If we have a rawData, delete it before Item
                    if (rawData && rawData.id) {

                        return rawData.destroy({
                            success: function (theObj) {
                                return item.destroy({
                                    success: function (anotherObj) {
                                        // I never pass here
                                        return Parse.Promise.as();
                                    },
                                    error: function (anotherObj, error) {
                                        // I never pass here
                                        return Parse.Promise.as();
                                    }
                                });
                            },
                            error: function (theObj, error) {
                                // I never pass here
                                return Parse.Promise.as();
                            }
                        });

                    } else {
                        return item.destroy({
                            success: function (anotherObj) {
                                // I never pass here
                                return Parse.Promise.as();
                            },
                            error: function (anotherObj, error) {
                                // I never pass here
                                return Parse.Promise.as();
                            }
                        });
                    }
                });
            });

            return promise;
        },
        error: function (error) {
            // I never pass here
            return Parse.Promise.error(error);
        }
    }).then(function (nil) {
        // I never pass here
        return Parse.Promise.as("DELETEOLDITEMS: Job finished");
    }, function(error) {
        // I never pass here
        return Parse.Promise.error(error);
    });
}

(我已经测试过用console.log()替换每一个//我从未通过这里,没有任何结果)

我尝试了很多不同的方法,但我相信这应该可行!或者至少返回错误!

有人知道我做错了什么吗?提前致谢!

编辑:

更奇怪的是,如果我修改 performMaintenanceTasks 以跳过 query.count():

function performMaintenanceTasks()
{
    return deleteOldItems(1);
}

这次deleteOldItems()中的query.find()被正确执行了!

这是什么意思?我不允许在同一个类上嵌套查询吗?

【问题讨论】:

  • 您将 Promise 和“旧式”回调与匿名函数混合在一起,我建议只保留它的 Promise。
  • 我在 Cloud Code 中使用这种编码风格没有问题,但感谢您的建议。尽管如此,我还是尝试了你所说的,只是为了 100% 确定;我摆脱了这些功能,并将所有承诺放在 Cloud.job() 中。不幸的是,这并没有改变任何事情。但是,随着我继续我的实验,我将更新我的问题,并且可能能够更好地指出问题所在。实际上可能是一个错误......

标签: parse-platform cloud


【解决方案1】:

我不确定这是否与您有关,但根据我的个人经验,Parse 日志可能看起来有点不直观。 Parse 日志默认只输出 10 行,因此请确保每次检查时都指定日志长度。

parse log -n 1000

...是我每次都倾向于做的事情。这只是使调试更容易。

【讨论】:

  • 是的,我知道这一点,但感谢分享信息!最后,我从performMaintenanceTasks() 中删除了count() 查询,但我从来不知道为什么deleteOldItems() 在嵌套时不能正确执行。我认为执行count() 请求的成本很高,而且我的表超过 100K 行,解析没有正确处理...
猜你喜欢
  • 2015-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 2015-08-08
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多