gpt4 book ai didi

javascript - 对数组中的每个元素执行异步函数?

转载 作者:行者123 更新时间:2023-11-30 06:25:34 29 4
gpt4 key购买 nike

所以我有一个 URL 数组

我想从每个文件中提取 html(我正在使用 restler node.js 库)

然后选择一些数据通过 jquery(我正在使用 cheerio node.js 库)

我的代码可以工作,但是会通过许多 URL 复制提取的数据。我在 Node 中执行此操作,但怀疑这是一个我不太了解的通用 Javascript 问题。

url.forEach(function(ugh){
rest.get(ugh).on('complete', function(data) {
$ = cheerio.load(data);
prices.push($(".priceclass").text());
//i only want this code to happen once per item in url array
//but it happens url.length times per item
//probably because i don't get events or async very well
});
});

因此,如果“url”数组中有 3 个项目,那么包含我想要的数据的“prices”数组将有 9 个项目。我不想要的

--编辑:

添加了一个计数器来验证“完成”回调是否对每个数组项执行了数组长度的次数。

x=0;
url.forEach(function(ugh){
rest.get(ugh).on('complete', function(data) {
var $ = cheerio.load(data);
prices.push($(".priceclass").text());
console.log(x=x+1);
});
});

控制台输出 1 2 3 4 5 6 7 8 9

我在想我可能做错了。我一直在尝试将一些数字压入一个数组,然后在回调之外对该数组做一些事情。

无论如何,很明显 >1 个 reSTLer 事件监听器根本不会一起工作。

也许改写这个问题会有所帮助:我如何抓取多个 URL,然后对这些数据采取行动?

目前正在研究请求和异步库,通过已熄灭的代码 node.io library

最佳答案

要回答重新表述的问题,scramjet如果您使用 ES6+ 和我假设您使用的 Node ,这将非常有用:

我如何抓取多个 URL,然后对这些数据采取行动?

安装包:

npm install scramjet node-fetch --save

Scramjet 在流上工作 - 它会读取您的 url 列表,并使每个 url 成为一个流,您可以像使用 Array 一样简单地使用它。 node-fetch 是一个遵循标准 Fetch Web API 的简单 Node 模块。

一个简单的示例,它也从文件中读取 url,假设您每行存储一个:

const {StringStream} = require("scramjet");
const fs = require("fs")
const fetch = require("node-fetch");

fs.createReadStream(process.argv[2]) // open the file for reading
.pipe(new StringStream()) // redirect it to scramjet stream
.split("\n") // split line by line
.map((url) => fetch(url)) // get the URL from the endpoint
.map((resp) => JSON.parse(resp)) // parse the response
.toArray() // accumulate the data into an Array
.then(
(data) => doYourStuff(data), // do the calculations
(err) => showErrorMessage(data)
)

由于超燃冲压发动机的工作方式,您无需担心错误处理(所有错误都会自动捕获)和管理同时请求。如果您可以逐个 url 解析文件 url,那么您还可以提高内存和资源的效率 - 因为它不会准备就绪并尝试一次获取所有项目,但它会并行执行一些工作。

scramjet docs 中有更多示例和完整的 API 描述.

关于javascript - 对数组中的每个元素执行异步函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21336809/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com