使用resolve eject将promise转换为异步函数
问题所以我是异步函数和承诺的新手,想象一下这样的承诺(请忽略语法错误)
await new Promise(async (resolve, reject ) => {
const page = await browser.newPage();
await page.goto('https://example.com').catch( ()=>reject('ERROR -> LINK 1 TIMEOUT '));
// INSERT USERNAME AND PASSWORD
await page.$eval('form', form => form.submit()).catch( ()=>reject('ERROR -> FORM SUBMIT ERROR '));
if( await page.$("#username"))
{
reject(" ERROR -> LOGIN FAILED !!!!!!!!!!!!!! ");
}
await page.waitForSelector('#xxx').catch( ()=>reject('ERROR -> WAITING FOR ELEMENT TIMEOUT '));
var scraped_data = // dop some page evaluate and scrap data;
resolve(scraped_data);
}).then(function(scraped_data){
await page.close();
console.log('all done');
insert_data_in_databas(scraped_data);
})
.catch(function(error){
console.log(' tab failed : ');
console.log(error);
});
我想把它转换成异步函数。。。怎么做才是正确的?我应该把它们都放在一个像
async function do_stuff(){
try {
const page = await browser.newPage();
await page.setViewport({ width: 1000, height: 1100});
await page.goto( 'https://example.com');
// INSERT USERNAME AND PASSWORD
await page.$eval('form', form => form.submit());
await page.waitForSelector('#xxx');
var scraped_data = // dop some page evaluate and scrap data;
await page.close();
console.log('all done');
insert_data_in_databas(scraped_data);
}
catch (e) {
await page.close();
console.log('error');
console.log(e);
}
}
如果出现阻止其他代码执行的错误,我该如何拒绝?我可以在 catch 块中有自定义错误文本吗
错误->表格提交错误
我该怎么办
if( await page.$("#username"))
{
reject(" ERROR -> LOGIN FAILED !!!!!!!!!!!!!! ");
}
在 try/catch 中,这不是实际错误(我的意思是它不是代码错误)?
--------------------- 编辑 --- - -------------
我试过
async function open_tab(){
try {
const page = await browser.newPage();
await page.setViewport({ width: 1000, height: 1100});
await page.goto( 'https://google.com');
await page.waitForSelector('#xxx').catch(()=> { throw new Error('ERROR -> LOGIN FAILED')});
await page.close();
console.log('all done');
}
catch (e) {
console.log('error');
console.log(e);
await page.close();
}
}
几乎可以使用,但我无法关闭塞子上的标签
UnhandledPromiseRejectionWarning:ReferenceError:页面未定义
标签保持打开状态,这并不理想
回答
不应该有新的 Promise,因为 Promise 已经存在并且可以被链接。
如果结果 promise 在 async 函数中被拒绝,则:
if (await page.$("#username")) {
throw new Error('ERROR -> LOGIN FAILED');
}
应该
let page;
try {
page = await browser.newPage();
代替
try {
const page = await browser.newPage();
页:
[1]