0

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

谢谢我真的很感激任何帮助......我已经被困了一段时间。

4

1 回答 1

0

如果是请求速率问题,那么您可能会使用类似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 代码如何或为什么会影响事情。

于 2015-08-22T19:57:15.380 回答