【问题标题】:Sending a lot of data in batches批量发送大量数据
【发布时间】:2015-07-31 19:28:51
【问题描述】:

我使用 jQuery CSV 导入器来导入 CSV 文件。处理完导入后,我有一个对象,其中包含每一行的对象,如下所示:

{
    {
        'name':'foo',
        'surname':'bar',
        'tel':'0123456789'
    },
    {
        ...
    }
}

因为 csv 文件可能有 10 行或 1000 行,我现在想将这些数据分批发送到服务器。我已经有一个函数可以将对象分成几块然后发布。

/**
 * @method sendChunks Sends data in chunks to the micro-service
 * @param object {object} Data that needs to be sliced up and sent
 * @param size {int} Size of chunks
 * @param endpoint {string} Where the data needs to be sent
 * @param callback {function} Callback function when all pieces are sent.
 */
function sendChunks(object,size,endpoint,callback) {
    var counter = 0,
        total = 0,
        sendObj = {
            'source':config.source,
            'country_code':config.country_code,
            'language_code':config.language_code,
            'batch_data': [],
        };
    objectLength = object.count();
    $.each(object, function (i, obj) {
        total++;
        if(counter < size && total != objectLength) {
            counter++;
            sendObj.batch_data.push(obj);
        } else {
            $.ajax({
                url: 'some_url',
                type: 'post',
                data: sendObj,
                success: function(data) {
                    if(total == objectLength) {
                        setNotification('Import completed','Contact was successfully imported.','panel-success panel');
                    }
                }
            });
            if(total == objectLength) {
                if(typeof callback == 'function') {
                    callback();
                } else {
                    console.log('failed to call function');
                }
            }
            counter = 1;
            sendObj.batch_data = []
        }
    })
},

问题是,ajax 请求是同时触发的。我希望他们一个接一个地开火。我怎样才能让它只有在上一批完成后才发送下一批?

【问题讨论】:

    标签: jquery ajax csv batch-processing


    【解决方案1】:

    在您的 ajax 调用中添加 async: false 参数:

             $.ajax({
                url: 'some_url',
                type: 'post',
                async: false, // <== one by one
                ...
    

    异步(默认:true)

    类型:布尔值

    默认情况下,所有请求都是异步发送的(即默认设置为 true)。如果您需要同步请求,请将此选项设置为 false。跨域请求和 dataType: "jsonp" 请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,从而在请求处于活动状态时禁用任何操作。从 jQuery 1.8 开始,不推荐在 jqXHR ($.Deferred) 中使用 async: false ;您必须使用成功/错误/完成回调选项,而不是 jqXHR 对象的相应方法,例如 jqXHR.done() 或已弃用的 jqXHR.success()。

    【讨论】:

    • 我确实看到了 async 但让我担心的是它可能会暂时锁定浏览器。我想知道是否有办法在避免浏览器锁定的同时做到这一点。
    • 看看api.jquery.com/jquery.deferred,稍微复杂一点,但不会锁定浏览器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多