在jQuery.ajax的beforeSend中加载异步内容

时间:2015-09-26 09:55:08

标签: javascript jquery ajax asynchronous

我使用jQuery发出ajax请求。

在发送所有ajax之前,我想读取一个特定的文件字段,并将内容附加到请求数据中:

<input id="upload" type="file" />

脚本:

$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        var file = document.getElementById('upload');
        if(file.files.length > 0) {
            var reader = new FileReader();
            reader.onload = function(e) {
                settings.data += '&file=' + btoa(e.target.result);
            }
            reader.readAsText();
        }
    }
});

问题是,当我调用reader.readAsText()时,会立即发送ajax请求,并且不要等到内容加载,因此无法保证数据更改完成,或者说,从不

那么在读取操作完成之前是否有任何延迟发送操作,或者使读取操作同步?

1 个答案:

答案 0 :(得分:2)

我认为最好将ajax请求绑定到reader.onload处理程序。

var file = document.getElementById('upload');
if(file.files.length > 0) {
    var reader = new FileReader();
    reader.onload = function(e) {
        settings.data += '&file=' + btoa(e.target.result);
        $.ajax({
            //send ajax ...
        });
    }
    reader.readAsText();
}

或者您可以在false中返回beforeSend并在reader.onload中创建一个新的ajax来取消当前的ajax。

$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        var file = document.getElementById('upload');
        if(file.files.length > 0) {
            var reader = new FileReader();
            reader.onload = function(e) {
                settings.data += '&file=' + btoa(e.target.result);
                $.ajax(settings); // Send another ajax...
            }
            reader.readAsText();
        }
    }
});