52ky 发表于 2022-5-6 15:59:28

使用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]
查看完整版本: 使用resolve eject将promise转换为异步函数