Promise.all error inside async function : undefined is not a function

匿名 (未验证) 提交于 2019-12-03 01:13:01

问题:

in my async function i use Promise.all but for some reason its not defined or something here is the function

async function check_available_money() {       global_browser = await puppeteer.launch({headless: false, args: ['--no-sandbox', '--disable-setuid-sandbox']});     const page = await global_browser.newPage();     await page.setViewport({width: 1000, height: 1100});     var setting = {'username': 'aa', 'password': 'bb'};       try {         await page.goto('https://example.com/login', {timeout: 90000})             .catch(function (error) {                     throw new Error(' TIMEOUT 1 ');                 }             );          await page.$eval('#username', (el, setting) => el.value = setting.username, setting);         await page.$eval('#password', (el, setting) => el.value = setting.password, setting);           console.log(tab_id + ' -> SUMITING LOGIN FORM  ');         await Promise.all(             page.$eval('form', form => form.submit()),             page.waitForNavigation()         )           console.log(tab_id + ' -> SUMITING LOGIN FORM DONE !  ');        }     catch (e) {          await page.close();         console.log(e);     } } 

i get error from this part

await Promise.all(             page.$eval('form', form => form.submit()),             page.waitForNavigation()         ) 

if i remove await Promise.all and just type

            await page.$eval('form', form => form.submit());             await page.waitForNavigation(); 

it works ok

here is error stack

TypeError: undefined is not a function     at Function.all (<anonymous>)     at check_available_money (D:\wamp\www\withdraw\robot\server.js:115:23)     at <anonymous>     at process._tickCallback (internal/process/next_tick.js:188:7) (node:13184) UnhandledPromiseRejectionWarning: Error: Protocol error (Runtime.callFunctionOn): Target closed.     at Promise (D:\wamp\www\withdraw\robot\node_modules\puppeteer\lib\Connection.js:202:56)     at new Promise (<anonymous>)     at CDPSession.send (D:\wamp\www\withdraw\robot\node_modules\puppeteer\lib\Connection.js:201:12)     at ExecutionContext.evaluateHandle (D:\wamp\www\withdraw\robot\node_modules\puppeteer\lib\ExecutionContext.js:79:75)     at ExecutionContext.evaluate (D:\wamp\www\withdraw\robot\node_modules\puppeteer\lib\ExecutionContext.js:46:31)     at ElementHandle.$eval (D:\wamp\www\withdraw\robot\node_modules\puppeteer\lib\ElementHandle.js:293:50)     at <anonymous>     at process._tickCallback (internal/process/next_tick.js:188:7) (node:13184) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 3) (node:13184) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code. (node:13184) UnhandledPromiseRejectionWarning: Error: Navigation Timeout Exceeded: 30000ms exceeded     at Promise.then (D:\wamp\www\withdraw\robot\node_modules\puppeteer\lib\NavigatorWatcher.js:73:21)     at <anonymous> (node:13184) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 4) 

回答1:

Promise.all takes an iterable, not multiple arguments. It tried to iterate your first argument, but that didn't have a [Symbol.iterator] method - "undefined is not a function". Pass an array:

await Promise.all([     page.$eval('form', form => form.submit()),     page.waitForNavigation(), ]) 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!