JavaScript - 在所有获取请求后运行回调以在多个 for 循环中完成 - 是否出错

rfl890

我正在写一点概念证明,它通过fetch(). 目前,我使用兼容资产查询所有标签,并针对每种资产类型通过 for 循环运行它。我需要做的是在循环中的所有请求完成后运行一个回调函数。我试过等待,但它会一一下载每个资产。我怎样才能做到这一点?

const scripts = document.querySelectorAll("script");
const links = document.querySelectorAll("link");
const images = document.querySelectorAll("img");
for (const script of scripts) {
    (async (s) => {
        const doIgnore = s.getAttribute("data-ignoreload");
        if (doIgnore) return;
        const src = s.getAttribute("data-src");
        if (!src) {
            console.error("Script does not have a data-src prop.");
            return;
        }
        fetch(src)
            .then(x => x.text())
            .then(r => {
                const newScript = document.createElement("script");
                newScript.innerHTML = r;
                document.body.appendChild(newScript);
            })
            .catch(err => {
                console.error(`Error loading script with src ${src}: ${err}`);
            });
    })(script);
}
for (const link of links) {
    (async (l) => {
        const doIgnore = l.getAttribute("data-ignoreload");
        if (doIgnore) return;
        const rel = l.getAttribute("rel");
        if (!(rel == "stylesheet")) {
            return;
        }
        const href = l.getAttribute("data-href");
        if (!href) {
            console.error("Stylesheet does not have a data-href prop.");
            return;
        }
        fetch(href)
            .then(x => x.text())
            .then(r => {
                const newStyle = document.createElement("style");
                newStyle.innerHTML = r;
                document.head.append(newStyle);
            })
            .catch(err => {
                console.error(`Error loading stylesheet with href ${href}: ${err}`);
            });
    })(link);
}
for (const image of images) {
    (async (i) => {
        const doIgnore = i.getAttribute("data-ignoreload");
        if (doIgnore) return;
        const src = i.getAttribute("data-src");
        if (!src) {
            console.error("Image does not have a data-src prop.");
            return;
        }
        fetch(src)
            .then(x => x.blob())
            .then(r => {
                const url = URL.createObjectURL(r);
                i.setAttribute("src", url);
            })
            .catch(err => {
                console.error(`Error loading image ${src}: ${err}`);
            });
    })(image);
}

xdumaine

将所有承诺推入一个数组,然后使用Promise.allSettled(promises).then((results) => {})

文档:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled

例子:

const promises = images.map(async (image) => {
    // do some async work
    return fetch(whatever); // don't .catch this

})

Promise.allSettled(promises).then((results) => {
  // results is a result of errors or successes
})

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

函数完成后,继续在for循环中运行JavaScript

是否可以在每个承诺完成后运行回调,然后在所有承诺完成后运行另一个?

Javascript / Node检查循环是否回调完成

Javascript-完成所有嵌套的forEach循环后的回调

在javascript循环中使用回调时,是否有任何方法可以保存循环中更新的变量以在回调中使用?

回调循环中的Javascript数组变异

for循环中的多个变量,Javascript

如何等待循环中的所有踏板完成运行

JavaScript循环在获取JSON的循环中

Javascript和回调并被推迟。google gmail API请求完成后,如何运行函数?

只有在所有循环成功后,才能使用DispatchGroup在for-in循环中处理异步回调

JavaScript如何确定AJAX调用何时在循环中完成

如何确定Task.Run是否在循环中完成

在JavaScript中的for循环中使用if语句时出错

在javascript条件循环中使用await会出错

在JavaScript循环中创建对象数组时出错

每个异步内部的异步任务:在所有任务和子任务完成后运行回调

在JavaScript while循环中添加回调

等待循环中调用的所有诺言完成

函数调用是否在此循环中同时运行有关系吗?如果是这样,我该如何等待直到上一次完成?

在javascript for循环中随机复制多个对象

在javascript foreach循环中获取索引

JavaScript在for循环中获取随机图像

在“ for”循环中获取Javascript对象内部

在for循环中完成相同功能后要做什么?

在可完成的将来循环中从db获取结果

For 循环中的异步获取 - 访问结果(已完成)变量

是否可以在循环中获取变量的输入?

在JavaScript映射的forEach循环中删除条目是否安全?