【问题标题】:Failing Parse background job when using beforesave with thousands of objects对数千个对象使用 beforesave 时解析后台作业失败
【发布时间】:2015-08-21 23:08:17
【问题描述】:

我正在使用后台作业来查询包含数千个对象的 json,以最初填充我的数据库。我还实现了 beforesave 功能以防止任何重复条目。但是,一旦我实现了这一点,我的后台作业似乎称为 response.error 并且不会保存所有对象。看起来我可能超过了请求/秒?如果有人可以查看我的代码并告诉我为什么它没有成功保存所有条目,我将不胜感激。

这是我的后台工作:

Parse.Cloud.job("testing", function(request, response) {

    var json;

    Parse.Cloud.httpRequest({
        url: stringURL + pageNumber.toString(),
        success: function(httpResponse) {

        json = httpResponse.data;
        console.log("total is: " + json["meta"].total);
        console.log("object 1 is: " + json["events"][1].title);
        return json;
        }
    //after getting the json, save all 1000
    }).then(function() {
 //helper function called
        saveObjects(json).then(function() {
            response.success("success");
        },
        function(error) {
            response.error("nooooo");
        });
  });
});

function saveObjects(json) {
    var promises = [];
    for(var i = 0; i < 1000; i++) {
        var newEvent = new Event();
        promises.push(newEvent.save(new Event(json["events"][i])));
    }
    return Parse.Promise.when(promises);
}

这是我之前保存的代码:

Parse.Cloud.beforeSave("Event", function(request, response) {
    var newEvent = request.object;
    var Event = Parse.Object.extend("Event");
    var query = new Parse.Query("Event");

    query.equalTo("title", newEvent.get("title"));
    query.equalTo("datetime_utc", newEvent.get("datetime_utc"));
    query.equalTo("url", newEvent.get("url"));
    query.first({

    success: function(temp) {
        response.error({errorCode:123,errorMsg:"Event already exist!"});          
    },
    error: function(error) {
        response.success();
    }
    });
});

谢谢,我真的很感谢任何帮助...我已经卡了一段时间了。

【问题讨论】:

    标签: ios parse-platform promise parse-cloud-code before-save


    【解决方案1】:

    如果是请求速率问题,那么您可能会使用 node-function-rate-limit 之类的东西,但编写自己的速率限制批处理器相当简单。请参阅下面的doInBatches()

    此外,当使用同时提供“success:...”回调的 promise-returning 方法时,最好不要混合使用这两种样式。它可能会按预期运行,但您没有机会将“成功:...”回调的结果传递给承诺链的其余部分。正如您在下面看到的,“成功:...”代码已简单地洗牌到 .then() 回调中。

    Parse.Cloud.job("testing", function(request, response) {
        Parse.Cloud.httpRequest({
            url: stringURL + pageNumber.toString()
        }).then(function(httpResponse) {
            var json = httpResponse.data;
            // console.log("total is: " + json.meta.total);
            // console.log("object 1 is: " + json.events[1].title);
            /* helper function called */
            doInBatches(json.events, 30, 1000, function(evt, i) {
                    var newEvent = new Event();
                return newEvent.save(new Event(evt));
            }).then(function() {
                response.success('success');
            }, function(error) {
                response.error('nooooo');
            });
        });
    });
    
    // Async batcher.
    function doInBatches(arr, batchSize, delay, fn) {
        function delayAsync() {
            var p = new Parse.Promise();
            setTimeout(p.resolve, delay);
            return p;
        }
        function saveBatch(start) {
            if(start < arr.length) {
                return Parse.Promise.when(arr.slice(start, start+batchSize).map(fn))
                .then(delayAsync) // delay between batches
                .then(function() {
                    return saveBatch(start + batchSize);
                });
            } else {
                return Parse.Promise.as();
            }
        }
        return saveBatch(0);
    }
    

    我看不出 beforesave 代码如何或为什么会影响事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多