使用带有数千个对象的beforesave时,失败解析后台作业

时间:2015-08-21 23:08:18

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

我正在使用后台作业来查询带有数千个对象的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);
}

这是我的beforesave代码:

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();
    }
    });
});

谢谢,我非常感谢任何帮助......我已经被困了一段时间。

1 个答案:

答案 0 :(得分:0)

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

此外,当使用也提供“success:...”回调的promise-returns方法时,最好不要混合使用这两种样式。它可能会按预期运行,但您无法将结果从“success:...”回调传递到promise链的其余部分。正如您在下面所看到的,“成功:...”代码已经被拖拽到.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代码如何或为何会影响事物。