node.js - 如何并发承诺限制到特定数量?
问题描述
在我的代码中,执行承诺是一一对应的。它不是并发概念。如何转换为具有限制 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);
});
}
})();
解决方案
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});
})();
推荐阅读
- firebase - 要求语句不是导入语句的一部分 - 谷歌可以函数和打字稿
- javascript - 当我在 MVC 中关闭选项卡或浏览器时,自动从站点注销用户
- google-pay - 使用 Google Pay 获取 Android 手机中的付款历史记录
- r - R - 使用 Map() 进行类型转换
- pandas - 在 pandas 中跨行添加计数唯一组合
- scheduled-tasks - 无法在谷歌云控制台或 pod 中安排 kubectl exec
- python - Matplotlib 添加数据导致文本下移
- python - 如何在方法中创建全局对象?
- matplotlib - 如何在单个图形上绘制声波、mfcc 和 mel 频谱图?
- python-3.x - Pyspark AES 256 解密(Mode_CFB)长度错误,但它适用于普通 python 3