我使用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请求,并且不要等到内容加载,因此无法保证数据更改完成,或者说,从不
那么在读取操作完成之前是否有任何延迟发送操作,或者使读取操作同步?
答案 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();
}
}
});