gpt4 book ai didi

javascript - 等待文件加载,然后在每个 'line' 上运行一个函数,但等待每行的返回

转载 作者:行者123 更新时间:2023-12-02 23:23:05 25 4
gpt4 key购买 nike

我一直在尝试理解 Promise,但遇到了困难。

==命令我希望代码运行==

  1. 我需要一个 .txt 文件将每一行加载到数组中。
  2. 等待这一切发生。
  3. 对返回的每个条目和数组运行一个函数。
  4. 等待数组的每个索引处理完毕,然后再执行下一个操作。

==我的功能==

  1. 调用此函数来启动程序。
async function start(){
var data = await getData();
console.log(data);
for (var i = 0; i < data.length; i++){
console.log(await searchGoogle(data[i]));
}

}
  1. “等待”来自 getData 的数据
async function getData(){
return new Promise(function(resolve, reject){
fs.readFile('./thingsToGoogle.txt', function(err, data) {
if(err) throw err;
var array = data.toString().split("\n");
resolve(array);
});
});
}
  1. 然后对数组中的每个索引调用 searchGoogle。
async function searchGoogle(toSearch) {
(async() => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://www.google.com/');
await page.type('input[name=q]', toSearch);
try {
console.log('Setting Search' + toSearch);
await page.evaluate(() => {
let elements = document.getElementsByClassName('gNO89b');
for (let element of elements)
element.click();
});
await page.waitForNavigation();
} catch (err) {
console.log(err)
}

try {
console.log("Collecting Data");
const[response] = await Promise.all([
page.waitForNavigation(),
await page.click('.rINcab'),
]);
} catch (err) {
console.log("Error2: " + err)
}

let test = await page.$$('.LC20lb');
// console.log(test);
allresults = [];
for (const t of test) {
const label = await page.evaluate(el => el.innerText, t);
if (label != "") {
allresults.push(label);
}
}
await browser.close();
resolve(allresults);

})();
}

问题是这不起作用。它不会等待文件加载。

Picture of Node JS output.

希望屏幕截图已上传,但您可以看到它堆叠了 SearchGoogle 函数 console.logs;

console.log('Setting..')
console.log('Setting..')
console.log('Collecting..')
console.log('Collecting..')

什么时候应该

console.log('Setting..')
console.log('Collecting..')
console.log('Setting..')
console.log('Collecting..')

这是“第一次”处理 promise ,我已经做了很多阅读,并编写了一些代码来理解它们,但是当我尝试应用这些知识时,我感到很挣扎。希望有人能帮忙。

-桃人-

最佳答案

具有并发限制的队列(使用p-queue)

您需要一个具有并发限制的队列。您将读取每一行并将它们添加到队列中。我们将使用readlinep-queue用于此的模块。

首先创建一个并发数为1的队列。

const {default: PQueue} = require('p-queue');
const queue = new PQueue({concurrency: 1});

然后,创建我们的阅读器实例。

const fs = require('fs');
const readline = require('readline');

const rl = readline.createInterface({
input: fs.createReadStream('your-input-file.txt')
});

对于文件的每一行,将一个条目添加到队列中。

rl.on('line', (line) => {
console.log(`Line from file: ${line}`);
queue.add(() => searchGoogle(line));
});

就是这样!如果你想一次处理10行,只需更改并发行即可。它仍然会一次读取一行,但队列将限制调用 searchGoogle 的数量。

enter image description here

可选修复:异步等待

您的代码具有以下结构,

async yourFunction(){
(async()=>{
const browser = await puppeteer.launch();
// ... rest of the code
})()
}

虽然这可能会按预期运行,但您将很难进行调试,因为每次运行 yourFunction 时都会创建一个匿名函数。

以下内容就足够了。

async yourFunction(){
const browser = await puppeteer.launch();
// ... rest of the code
}

关于javascript - 等待文件加载,然后在每个 'line' 上运行一个函数,但等待每行的返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56859120/

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