当前位置: 首页 > 知识库问答 >
问题:

javascript - js如何在并发中同步两个fetch请求?

汪翰墨
2024-12-03

请求A的结果是B的参数,所以AB只能是同步请求,但有假设有100个AB请求,如何构造并发请求呢?


const get_cover = async (guid) => {
    // ...
    let response = await fetch(url)
    let data = await response.text()
    // ... url 从data中解析
    response = await fetch(url)
    data = await response.text()
    
    return data
}


const get_covers = async () => {
    const promises = comics.map(async comic => {
        try {
            // 图片地址
            comic.cover = await get_cover(comic.url);
        } catch (error) {
            console.error(`Error fetching cover from ${comic.url}:`, error);
        }
    });

    await Promise.all(promises);
}

这个代码完全不行,等待时间太长了。

假设一组AB耗时2s,上面的代码需要等待近1min才能获得数据,我希望能获得一组AB就显示一张图片,类似并行处理同步的AB?

谢谢!

共有2个答案

小牛23375
2024-12-03

你用forEach不久行了?��

comics.forEach(async (comic, index) => {
    try {
        // 图片地址
        comic.cover = await get_cover(comic.url);
        // 每拿到一个图片url就渲染,不用等其他的头像拿到了,再渲染到页面
        // 伪代码,不知道你实际渲染在页面上是用的哪个变量来渲染的
        // 写这个代码意思下
        this.renderDataList[index].cover = comic.cover
    } catch (error) {
        console.error(`Error fetching cover from ${comic.url}:`, error);
    }
})
荣曾笑
2024-12-03
const pLimit = require('p-limit');
const limit = pLimit(20); // 这里设置并发限制为20,可以根据需要调整

const get_cover = async (guid) => {
    try {
        let response = await fetch(`https://example.com/api/a/${guid}`);
        let data = await response.text();
        let url = parseUrlFromData(data);
        response = await fetch(url);
        data = await response.text();
        return data;
    } catch (error) {
        console.error(`Error fetching cover for ${guid}:`, error);
        throw error;
    }
}

const get_covers_concurrently = async () => {
    const promises = comics.map(comic => limit(() => get_cover(comic.url).then(cover => {
        comic.cover = cover;
    }).catch(error => {
        console.error(`Error fetching cover from ${comic.url}:`, error);
    })));

    await Promise.allSettled(promises);
}
 类似资料:
  • 问题内容: 如何在AngularJS中阻止HTTP请求,以便我可以在下一行使用$ http响应? 在下面的示例中,object不会将结果返回到下一行,因此我可以将此结果传递给JavaScript库,因为它返回空白值。 这是示例代码: 问题答案: 您可以为此使用诺言。 这是一个例子:

  • 假设,我有如下 concurrentHashMap 代码: 此 方法是从多个线程调用的,可以尝试同时更新同一 accountId 的数量。 如何确保currentBalance在< code>get和< code>put之间不发生变化?因为根据我的理解,如果线程在执行< code>get后抢占,同时其他线程更新余额,< code>put将使用旧余额执行更新。

  • 经常看到的一个题目,特此求解 gpt的写法是: async/await callback function

  • 问题内容: 当我使用JQuery一起发送两个ajax请求时,响应一起出现 例如 ajax.php,ajax2.php是两个文件,其中包含一个虚拟的for循环大约需要5秒钟。 萤火虫萤幕 POST本地主机/ajax.php 200 OK 4.77s POST本地主机/ajax.php 200 OK 4.37s 在这里,每个请求大约需要5秒钟才能执行… 当我在symfony做相同的例子时,我得到了不同

  • 我有一个vertx服务器应用程序,在那里我收到单客户端请求,从服务器,我需要进行两次阻塞调用。例如,一个调用后端系统A,另一个调用后端系统B。我希望同时调用两个系统。我需要等待两个调用的响应,然后合并两个调用中的两个数据,然后将响应发送回客户端。我不知道如何在工人垂直运动中做到这一点。 有谁能推荐vertx中最好的方法吗?

  • 两个(切换)按钮是否可能在片段之间具有同步行为?即:当按钮A在片段A中打开时,我希望按钮B在片段B中的外观也显示为打开。 我该怎么做呢?最终目标是在任何一个片段上都有一个全局按钮。

  • 问题内容: 我想使用rsync 在两个方向上 同步 两个目录。 我指的是经典意义上的同步( 不是 rsync手册中的含义): 我想 双向 更新目录,具体取决于哪个 更新 。 可以通过rsync (在Linux方式中更可取) 完成此操作吗? 如果没有,还有哪些其他解决方案? 问题答案: 只需使用“较新”模式(-u或– update标志)加上-t(复制文件修改时间),-r(用于递归文件夹)和-v(用于

  • 同步(Synchronization) 线程间的通信主要是通过共享访问字段以及其字段所引用的对象来实现的。这种形式的通信是非常有效的,但可能导致2种可能的错误:线程干扰(thread interference)和内存一致性错误(memory consistency errors)。同步就是要需要避免这些错误的工具。 但是,同步可以引入线程竞争(thread contention),当两个或多个线程