首页 > 解决方案 > 如何并发承诺限制到特定数量?

问题描述

在我的代码中,执行承诺是一一对应的。它不是并发概念。如何转换为具有限制 8 承诺的并发。所以它就像创建一个限制为 8 承诺的池。然后,实时推送和读取承诺输出。

例子。

如果在 1 秒内它可以完成 2 个承诺工作,那么它将输出 2 个承诺。并再次用 2 个新的承诺工作填充池。

我不希望它等待 8 个承诺工作同时完成,然后再次开始用 8 个工作填充池。

import fetch from 'node-fetch';
import { load } from 'cheerio';

(async () => {
    const response = await fetch('https://hentairead.com/page/1/');

    const $ = load(await response.text());

    const totalPage = $('span.pages')
                        .text()
                        .match(/\d{3,}/g)
                        .toString();

    for(let page = 1; page <= totalPage; page++)
    {
        const response = await fetch(`https://hentairead.com/page/${page}/`);

        const $ = load(await response.text());

        $('div.item-thumb.c-image-hover > a').each((index, item) => {
            console.log(item.attribs.title);
        });
    }
})();

标签: node.js

解决方案


import fetch from 'node-fetch';
import { load } from 'cheerio';
import {CPromise} from "c-promise2";

(async () => {
    const response = await fetch('https://hentairead.com/page/1/');

    const $ = load(await response.text());

    const totalPage = $('span.pages')
                        .text()
                        .match(/\d{3,}/g)
                        .toString();

    const fetchPage= async (page)=>{
        const response = await fetch(`https://hentairead.com/page/${page}/`);

        const $ = load(await response.text());

        $('div.item-thumb.c-image-hover > a').each((index, item) => {
            console.log(item.attribs.title);
        });
    }

    await CPromise.all(function*(){
       for(let page = 1; page <= totalPage; page++){
          yield fetchPage(page);
       }
    }, {concurrency: 8});
})();

推荐阅读