[英]How to handle asynchronous behaviour of Node.js - Puppeteer?
因此,基本上,我正在使用puppeteer下载CSV文件,然后读取CSV文件,然后使用我的命名结构创建一个新文件,并将该数据放在dropbox文件夹中。 对于不同的帐户,此过程一次又一次地重复。 问题在于,由于node.js的异步行为,它开始下载另一个文件,而不等待文件写入过程完成。 由于此问题,由于文件夹名称也在循环中传递,因此文件存储在错误的文件夹中。 我该如何解决这个问题?
const puppeteer = require('puppeteer');
var datetime = require('node-datetime');
var dt = datetime.create();
dt.offsetInDays(-2);
var start_date = dt.format('Y-m-d');
dt.offsetInDays(1);
var end_date = dt.format('Y-m-d');
dt.offsetInDays(0);
var date = dt.format('Y-m-d');
var fs = require('fs'),
path = require('path'),
_ = require('underscore');
var user_details = [
{
username : 'user1',
password : 'password1',
folder_name : 'folder1'
},
{
username : 'user2',
password : 'password2',
folder_name : 'folder2'
},
{
username : 'user3',
password : 'password3',
folder_name : 'folder3'
},
{
username : 'user4',
password : 'password4',
folder_name : 'folder4'
}];
(async () => {
console.log(user_details.length);
for( var i=0; i<user_details.length; i++){
var username = user_details[i]['username'];
var password = user_details[i]['password'];
var folder_name = user_details[i]['folder_name'];
console.log(username);
console.log(folder_name);
const browser = await puppeteer.launch({ headless: false});
const page = await browser.newPage();
await page.goto('url', {waitUntil: 'networkidle2'});
await page.waitFor('input[name=name]');
await page.$eval('input[name=name]', (el, _username) => el.value = _username, username);
await page.$eval('input[name=password]', (el, _password) => el.value = _password, password);
await page.click('input[type=submit]');
await page.waitFor('.breadcrumb')
await page.goto('url', {waitUntil: 'networkidle2'});
await page.waitForSelector('.csv_toggle');
await page.click('.action');
await page.click('.fa-files-o');
await page.waitFor(10000);
var dir = '/users/user/Downloads/';
var files = fs.readdirSync(dir);
// use underscore for max()
var file_name = _.max(files, function (f) {
var fullpath = path.join(dir, f);
// ctime = creation time is used
// replace with mtime for modification time
return fs.statSync(fullpath).ctime;
});
var filePath = path.join('/users/user/Downloads/',file_name);
fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){
if (!err) {
lines = data;
fs.writeFile("/users/user/Dropbox/Puppeteer/"+folder_name+"/data_"+folder_name+"_"+date+"_.csv", data, function(err) {
if(err) {
console.log(err);
}
console.log("The file was saved!");
console.log('Closing Browser');
browser.close();
});
} else {
console.log('-----SOMETHING IS WRONG-----');
}
});
await page.waitFor(10000);
}
})();
上面的代码可以正常工作,因为我使用了10秒钟的延迟才能完成写入过程,但这是一种破解,并且在Internet连接速度慢或机器速度慢时肯定无法正常工作。 我想要的是它首先应该等待文件完全下载,然后等待文件写入过程完成,然后继续为下一个用户循环。
在fs.readFile和fs.writeFile方法中也添加await。
采用
let data = await fs.readFile(filePath, {encoding: 'utf-8'});
await fs.writeFile("/users/user/Dropbox/Puppeteer/"+folder_name+"/data_"+folder_name+"_"+date+"_.csv", data);
browser.close();
代替
fs.readFile(filePath, { encoding: 'utf-8' }, function (err, data) {
if (!err) {
lines = data;
fs.writeFile("/users/user/Dropbox/Puppeteer/" + folder_name + "/data_" + folder_name + "_" + date + "_.csv", data, function (err) {
if (err) {
console.log(err);
}
console.log("The file was saved!");
console.log('Closing Browser');
browser.close();
});
} else {
console.log('-----SOMETHING IS WRONG-----');
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.