【发布时间】:2019-11-13 11:52:00
【问题描述】:
我一直在尝试理解 Promise,但我遇到了障碍。
==Order 我要代码运行==
- 我需要一个 .txt 文件来将每一行加载到一个数组中。
- 等待这一切发生。
- 对每个返回数组的条目运行一个函数。
- 等待要处理的数组的每个索引,然后再执行下一个。
==我的功能==
- 调用该函数启动程序。
async function start(){
var data = await getData();
console.log(data);
for (var i = 0; i < data.length; i++){
console.log(await searchGoogle(data[i]));
}
}
- '等待'来自 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);
});
});
}
- 然后对数组中的每个索引调用 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);
})();
}
问题是这不起作用。它不会等待文件加载。
希望屏幕截图已上传,但您可以看到它堆叠了 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,我对它们进行了大量阅读并编写了一些代码来理解它们,但是当我尝试应用这些知识时,我感到很挣扎。希望有人能帮忙。
-桃人-
【问题讨论】:
-
我认为帖子缺少问题陈述。又是什么问题?
-
@Joseph 刚刚修正了我的问题。基本上它不这样做...... :(
-
这里的重点是按顺序得到一系列处理过的行吗?如果是这样,您不必像在问题中那样等待。您已经过度指定了一组更复杂的要求。
-
@jfriend00 当我有成千上万个条目的文档时,问题就来了。我无法一次处理所有这些,搜索 Google 功能需要几秒钟来处理一个条目。因此,为什么我想做一个,等到它完成,再做一个,然后等到它完成......
-
如果您一次处理 N 个条目,您可以配置 N 是多少,那么系统可能会表现最佳,但我猜想在 10-20 范围内的某个地方。这样您就不会占用过多的系统资源,也不会花费大部分 CPU 空闲时间等待网络响应。
标签: javascript node.js asynchronous promise puppeteer