[软件设计/软件工程] 使用resolve eject将promise转换为异步函数

[复制链接]
发表于 2022-5-6 15:59:28
问题
所以我是异步函数和承诺的新手,想象一下这样的承诺(请忽略语法错误)
  1. await new Promise(async (resolve, reject ) => {
  2.     const page = await browser.newPage();

  3.     await page.goto('https://example.com').catch( ()=>reject('ERROR -> LINK 1 TIMEOUT '));
  4.     // INSERT USERNAME AND PASSWORD
  5.     await page.$eval('form', form => form.submit()).catch( ()=>reject('ERROR -> FORM SUBMIT ERROR '));

  6.         if( await page.$("#username"))
  7.         {

  8.             reject(" ERROR -> LOGIN FAILED !!!!!!!!!!!!!! ");
  9.         }




  10.     await page.waitForSelector('#xxx').catch( ()=>reject('ERROR -> WAITING FOR ELEMENT TIMEOUT '));

  11.     var scraped_data = // dop some page evaluate and scrap data;

  12.     resolve(scraped_data);

  13. }).then(function(scraped_data){

  14.     await page.close();
  15.     console.log('all done');
  16.     insert_data_in_databas(scraped_data);

  17. })
  18. .catch(function(error){

  19.     console.log(' tab failed : ');
  20.     console.log(error);
  21. });

  22. 我想把它转换成异步函数。。。怎么做才是正确的?我应该把它们都放在一个像

  23. async function do_stuff(){

  24.     try {
  25.         const page    = await browser.newPage();
  26.         await page.setViewport({ width: 1000, height: 1100});
  27.         await page.goto( 'https://example.com'  );
  28.         // INSERT USERNAME AND PASSWORD
  29.         await page.$eval('form', form => form.submit());
  30.         await page.waitForSelector('#xxx');
  31.         var scraped_data = // dop some page evaluate and scrap data;
  32.         await page.close();
  33.         console.log('all done');
  34.         insert_data_in_databas(scraped_data);   
  35.     }
  36.     catch (e) {
  37.         await page.close();
  38.         console.log('error');
  39.         console.log(e);
  40.     }
  41. }
复制代码

如果出现阻止其他代码执行的错误,我该如何拒绝?我可以在 catch 块中有自定义错误文本吗

错误->表格提交错误

我该怎么办
  1.   if( await page.$("#username"))
  2.         {

  3.             reject(" ERROR -> LOGIN FAILED !!!!!!!!!!!!!! ");
  4.         }
复制代码

在 try/catch 中,这不是实际错误(我的意思是它不是代码错误)?

-  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 编辑 -  -  - - -------------

我试过
  1. async function open_tab(){

  2.     try {
  3.         const page    = await browser.newPage();
  4.         await page.setViewport({ width: 1000, height: 1100});
  5.         await page.goto( 'https://google.com'  );
  6.         await page.waitForSelector('#xxx').catch(()=> { throw new Error('ERROR -> LOGIN FAILED')});
  7.         await page.close();
  8.         console.log('all done');
  9.     }
  10.     catch (e) {
  11.         console.log('error');
  12.         console.log(e);
  13.         await page.close();

  14.     }
  15. }
复制代码

几乎可以使用,但我无法关闭塞子上的标签

UnhandledPromiseRejectionWarning:ReferenceError:页面未定义

标签保持打开状态,这并不理想

回答
不应该有新的 Promise,因为 Promise 已经存在并且可以被链接。

如果结果 promise 在 async 函数中被拒绝,则:
  1. if (await page.$("#username")) {
  2.    throw new Error('ERROR -> LOGIN FAILED');
  3. }
复制代码

应该
  1. let page;
  2. try {
  3.     page    = await browser.newPage();
复制代码

代替
  1. try {
  2.     const page    = await browser.newPage();
复制代码






上一篇:如何使用 Google Fit API 查找适用于 Android 的步骤?
下一篇:如何在 ASP.NET Core 中启用 CORS

使用道具 举报

Archiver|手机版|小黑屋|吾爱开源 |网站地图

Copyright 2011 - 2012 Lnqq.NET.All Rights Reserved( ICP备案粤ICP备14042591号-1粤ICP14042591号 )

关于本站 - 版权申明 - 侵删联系 - Ln Studio! - 广告联系

本站资源来自互联网,仅供用户测试使用,相关版权归原作者所有

快速回复 返回顶部 返回列表