javascript - 异步函数内的 Promise.all 错误:未定义不是函数
问题描述
在我的异步函数中我使用Promise.all
但由于某种原因它没有定义或者这里是函数
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);
}
}
我从这部分得到错误
await Promise.all(
page.$eval('form', form => form.submit()),
page.waitForNavigation()
)
如果我删除await Promise.all
并输入
await page.$eval('form', form => form.submit());
await page.waitForNavigation();
它工作正常
这是错误堆栈
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)
解决方案
Promise.all
接受一个可迭代的,而不是多个参数。它试图迭代您的第一个参数,但没有[Symbol.iterator]
方法 - “未定义不是函数”。传递一个数组:
await Promise.all([
page.$eval('form', form => form.submit()),
page.waitForNavigation(),
])
推荐阅读
- javascript - 如何正确定义函数的数组参数?
- python - 不理解地计算总和
- javascript - 如何使用数组包含函数检查对象数组中的对象相等性?
- apache-spark - 所需的执行程序内存高于此集群的最大阈值
- reactjs - 如何使用 webpack ManifestPlugin 为具有 2 个入口点的反应项目创建 2 个不同的 manifest.json 文件?
- dictionary - 为什么我不能在这里创建一个简单的字典
- reactjs - 使用 Next.js 进行 S3 上传 - 面临问题
- angular - 在订阅之前解析为 observable 的值
- c++ - 调试 X11 程序时如何避免 SIGPIPE(由于超时?)?
- javascript - “必需”标签第一次不起作用