Javascript 在jQuery.ajax的beforeSend中加载异步内容
我正在使用jQuery发出ajax请求 在发送所有ajax之前,我想读取一个特定的文件字段,并将内容附加到请求数据中: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处理程序
<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();
}
}
});