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

Javascript 在jQuery.ajax的beforeSend中加载异步内容,javascript,jquery,ajax,asynchronous,Javascript,Jquery,Ajax,Asynchronous,我正在使用jQuery发出ajax请求 在发送所有ajax之前,我想读取一个特定的文件字段,并将内容附加到请求数据中: <input id="upload" type="file" /> 问题是,当我调用reader.readAsText()时,ajax请求会立即发送,并且不会等到内容加载后再发送,因此数据更改不能保证完成,或者说永远不会完成 那么,是否有什么方法可以延迟发送操作直到读取操作完成,或者使读取操作同步?我认为最好将ajax请求绑定到reader.onload处理程序

我正在使用jQuery发出ajax请求

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

<input id="upload" type="file" />
问题是,当我调用
reader.readAsText()
时,ajax请求会立即发送,并且不会等到内容加载后再发送,因此数据更改不能保证完成,或者说永远不会完成


那么,是否有什么方法可以延迟发送操作直到读取操作完成,或者使读取操作同步?

我认为最好将
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
来取消当前的ajax,并在
reader.onload中创建一个新的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();
        }
    }
});

beforeSend
用于在发送前访问原始请求头。你想在请求之前做的事情…在请求之前做的事情:))你想在请求之前创建
FileReader
,并在其
onload
处理程序中发出请求。@moonwave99,我知道,但我正在开发一个jQuery插件,允许在数据部分添加文件和blob字段。如果我给出了filecontent(支持二进制流),ajax会将这些内容作为文件上传。但是我在这里被阻止了。@moonwave99,而且,我想保持接口的简单,我可以用这种方式调用,并且希望它能够被支持:
$.ajax('url',{data:{file:fileInput.files[0];}})那么好吧,做
$。文件上传(url,参数)
,通过重新调整承诺来维护
$.ajax
契约,你就完成了:))通过
ajaxSetup
为所有请求注入一些东西可能太普遍了。我知道这一点,但我正在开发一个jQuery插件,允许在数据部分添加文件和blob字段。如果我给出了filecontent(支持二进制流),ajax会将这些内容作为文件上传。但是我在这里被阻止了。我认为在这种情况下,您应该返回
false
以取消此
ajax
,并在
reader.onload
中在
发送之前创建一个新的。更新了我的答案。虽然创建另一个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();
        }
    }
});