代码之家  ›  专栏  ›  技术社区  ›  max

将带有解析和拒绝的承诺转换为异步函数的正确方法(puppeter)

  •  1
  • max  · 技术社区  · 6 年前

    所以我不熟悉异步函数和承诺,想象一下这样的承诺(请忽略语法错误)

    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);
        }
    }
    

    ERROR -> FORM SUBMIT ERROR 
    

    我该怎么做

      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: page is not defined
    

    标签仍然打开,这并不理想

    1 回复  |  直到 6 年前
        1
  •  0
  •   Estus Flask    6 年前

    应该没有 new 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();
    
        2
  •  0
  •   Dadmand    4 年前

    const puppeteer = require("puppeteer");
    const param_puppeteer = {
      args: [
        "--incognito",
        "--ignore-certificate-errors",
        "--no-sandbox",
        "--disable-setuid-sandbox",
        "--window-size=1920,1080",
        "--disable-accelerated-2d-canvas",
        "--disable-gpu",
    
        // '--unlimited-storage',
        // '--no-startup-window',
        // '--disable-dev-shm-usage',
        // '--disable-crash-reporter',
        // '--disable-breakpad'
      ],
      headless: false,
    };
    
    async function start() {
      return puppeteer
        .launch(param_puppeteer)
        .then(async (browser) => {
          const page = await browser.newPage();
          return await task(page)
            .catch((err) => console.log(err))
            .finally(() => browser.close());
        })
        .catch((err) => console.log(err));
    }
    
    async function task(page) {
      await page.setViewport({ width: 1000, height: 1100 });
      await page.goto("https://google.com");
      await page.waitForSelector("#hplogo");
      let exist = await page.$("#hplogo").then((res) => !!res);
      if (exist) {
        return new Promise((resolve, reject) => resolve("success"));
      } else {
        return new Promise((resolve, reject) => reject("failed"));
      }
    }
    
    start();