【发布时间】:2019-08-06 20:40:24
【问题描述】:
在我解释我想要做什么之前,这是我正在编码的 MCV
$("#button").submit(function(event) {
event.preventDefault();
var formData = new FormData(this);
var myString = $('#textarea').val();
var myRegexp = /src="blob:([^'"]+)"/gm;
match = myRegexp.exec(myString);
var inProgress = 0;
while (match != null) {
var xhr = new XMLHttpRequest();
addr = match[1];
xhr.open('GET', 'blob:' + addr, true);
xhr.responseType = 'blob';
xhr.onload = function(e) {
if (this.status == 200) {
var myBlob = this.response;
var data = new FormData();
data.append('file', myBlob);
$.ajax({
url: "uploader.php",
type: 'POST',
data: data,
contentType: false,
processData: false,
beforeSend: function() {
inProgress++;
},
success: function(data) {
myString = myString.replace("blob:" + addr, data);
},
error: function() {
// error
},
complete: function() {
--inProgress;
}
});
} else {
// error
}
};
xhr.send();
match = myRegexp.exec(myString);
}
if (!inProgress) {
formData.set('textarea', myString);
submitForm(formData);
}
});
所以,我有一个文本区域,其中包含未知数量的 BLOB 对象。我首先尝试使用正则表达式查找这些 BLOB 对象,然后使用名为 uploader.php 的 PHP 文件将它们上传到服务器。文件上传后,会返回上传文件的URL,我想在文本区用上传文件的URL替换BLOB URL,然后将文本区的最终内容提交给服务器做进一步处理。
事实证明,当我运行代码时,只有正则表达式的最后一个实例被其上传的 URL 替换。其他人保持原样。我怀疑这是因为 while 循环不等待 ajax 请求完成。我在尝试提交表单时遇到了类似的问题,我按照answer 中的建议解决了这个问题,但这次我不知道如何解决这个问题。
任何想法都值得赞赏
更新:我尝试让 ajax 同步工作,但我的浏览器说它已被弃用并且无法正常工作。
【问题讨论】:
-
你试过async/await和fetch吗?我不使用 jQuery(我认为纯 JS 是最好的)所以我不知道 jQuery 的 $.ajax 是否适用于 Promises。
-
@SkillGG - OP 同时使用 vanilla 和 jQuery :-/)
-
没有vanila就没有jQuery :)
-
我会使用 fetch() 和 XMLHttpRequest(带有 Header)稍微改变以返回 Promise 并等待它等待它。但我不会使用 $.ajax,所以我不知道这个解决方案是否适合 OP。
标签: javascript jquery ajax while-loop