【发布时间】:2021-06-04 23:04:03
【问题描述】:
好的,所以我尝试在 for 循环中执行异步等待以进行获取,最后将结果附加到所见即所得。当用户在编辑器中粘贴并循环图像以保存在我的服务器上时,我正在获取剪贴板数据。首先它通过 fetch() 从图像的 url 中获取 blob,然后再次使用 fetch() 将文件上传到我的服务器。这是代码:
const forLoop = async _ => {
for (let i = 0; i < imgNodeList.length; i++) {
const img = imgNodeList[i];
if (img.src) {
let src = img.src;
async function fetchBlob(src) {
const response = await fetch(src);
const blob = await response.blob();
return blob;
}
async function fetchUrl(file) {
const formData = newTokenData();
formData.append("image", file);
const response = await fetch('upload-image', { method: "POST", body: formData });
const json = await response.json();
return json;
}
fetchBlob(src).then(blob => {
let file = new File([blob], "new_file");
fetchUrl(file).then(json => {
console.log('image');
if (isJson(json)) {
let obj = JSON.parse(json);
if (obj.status == '200') {
tmp.querySelectorAll('img')[i].src = obj.url;
}
}
})
});
}
console.log('loop end');
}
console.log('execute html');
quill.clipboard.dangerouslyPasteHTML(index, tmp.innerHTML);
}
forLoop();
但是图像console.log在最后发生如下: 我该怎么做才能让代码等待 fetch inside 循环结束并在整个循环结束后在编辑器中执行粘贴操作。
【问题讨论】:
-
您不能让
for循环等待。它是一个简单的for循环,不注意循环体中的异步行为。您可以将循环体收集到一个单独的async函数中,然后将调用它的 Promise 实例收集到一个数组中,然后在循环后使用Promise.all()等待它们全部解决。 -
将
async/await编码与.then()编码混合并不是一个好主意;使用其中一个。
标签: javascript asynchronous async-await fetch