Javascript 木偶演员功能不运行有什么问题吗?
每当我的代码到达Javascript 木偶演员功能不运行有什么问题吗?,javascript,node.js,puppeteer,Javascript,Node.js,Puppeteer,每当我的代码到达setStartDate函数时,什么都不会发生我添加了console.log消息,但它们并不像我想象的那样按顺序出现。我想,Promise.all()。。。。。另外,我在async/promises/await方面的知识也不是最丰富的:)谢谢你的帮助 我得到的控制台日志的顺序 登录初始化 开始初始化 结束初始化 确认初始化 登录端 我想我保证一切都会井然有序 这基本上与承诺相反。所有的都做: 在执行给定的承诺数组时没有隐含的顺序。在某些计算机上,它们可以并行执行,或者在某种意
setStartDate
函数时,什么都不会发生我添加了
console.log
消息,但它们并不像我想象的那样按顺序出现。我想,Promise.all()。。。。。另外,我在async/promises/await方面的知识也不是最丰富的:)谢谢你的帮助
我得到的控制台日志的顺序
登录初始化
开始初始化
结束初始化
确认初始化
登录端
我想我保证一切都会井然有序
这基本上与承诺相反。所有的都做:
在执行给定的承诺数组时没有隐含的顺序。在某些计算机上,它们可以并行执行,或者在某种意义上并发执行,而在另一些计算机上,它们可以串行执行。因此,任何承诺都不得依赖于承诺的执行顺序
您应该按顺序等待您的功能:
等待登录()
等待设置开始日期()
等待setEndDate()
等待确认时间表()
Promise.all()将以相同的顺序放置结果数组的元素,但调用不会是连续的。@ChrisG有趣。那么这个代码有多糟糕呢?不太糟糕;只需使用类似于steps.forEach(step=>await step)
的方法,我的注释中的示例应该按原样工作<代码>等待步骤
是主体。不幸的是,forEach
不能很好地处理等待
(它不会在迭代之间等待承诺解决方案)。你必须使用老式的for循环,并在其中等待。是的,Promise。当你不关心执行顺序时,所有的
都是有用的,只要所有的承诺都能成功解决。根据MDN:“这种方法对于聚合多个承诺的结果非常有用。”
const puppeteer = require('puppeteer');
const init = async () => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
// login
let login = async () => {
console.log('login init');
await page.goto(HOME_PAGE);
await page.type($clientID, CLIENT_ID);
await page.type($userName, USER_NAME);
await page.type($password, PASSWORD);
await page.click($submitBtn);
await page.waitFor(WAIT_SEC);
await page.goto(SCHEDULE_PAGE);
console.log('login end');
}
// look for schedule
let setStartDate = async () => {
console.log('start init');
await page.waitFor(3000);
await page.click('#selfsched_startDate_dtInput', { clickCount: 3 });
await page.keyboard.press('Backspace');
await page.type($startDate, START_DATE);
console.log('start end');
}
let setEndDate = async () => {
console.log('end init');
await page.click($endDate, { clickCount: 3 });
await page.keyboard.press('Backspace');
await page.type($endDate, END_DATE);
await page.keyboard.press('Enter');
console.log('end end');
}
let confirmSchedule = async () => {
console.log('confirm init');
await page.waitFor(WAIT_SEC);
await page.click($confirmBtn);
console.log('confirm end');
}
let steps = [
login(),
setStartDate(),
setEndDate(),
confirmSchedule()
];
await Promise.all(steps);
console.log('im finishing');
browser.close();
}
init()
.then(values => {
console.log('success');
})
.catch(err => {
});