【问题标题】:How to handle "promise rejections are deprecated"如何处理“不推荐使用承诺拒绝”
【发布时间】:2020-05-23 04:18:22
【问题描述】:

我正试图用 Promise 来解决我的问题,我收到这个错误,抱怨未处理的 Promise 拒绝,但如果它被拒绝,我确实有一个 catch

谁能帮我解决我做错了什么?

这是我的代码:

var webdriver = require('selenium-webdriver');

function searchTextOnGoogle() {
  var driver = new webdriver.Builder().forBrowser("chrome").build();

  driver.get("www.google.com").then(function() {
    driver.findElement(webdriver.By.linkText("Automation")).click().then(function() {
      driver.getTitle().then(function(title) {
        setTimeout(() => {
          console.log(title);
          driver.quit();
        }, 5000);
      });
    }).catch(function(err) {
      console.log(err);
    });
  });
}

错误:

(node:200092) UnhandledPromiseRejectionWarning: 未处理的承诺 拒绝。此错误源于在异步内部抛出 没有 catch 块的函数,或者通过拒绝一个承诺 不使用 .catch() 处理。 (拒绝 ID:1)(节点:200092)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。在 未来,未处理的承诺拒绝将终止 具有非零退出代码的 Node.js 进程。

整个错误信息:

DevTools 监听 ws://127.0.0.1:62260/devtools/browser/6dd5b3dc-f6bb-4147-9421-a6e0e172017b(node:191496) UnhandledPromiseRejectionWarning: InvalidArgumentError: 无效 参数(会话信息:chrome=79.0.3945.117) 在 Object.throwDecodedError (C:\promise\node_modules\selenium-webdriver\lib\error.js:550:15) 在 parseHttpResponse (C:\promise\node_modules\selenium-webdriver\lib\http.js:563:13) 在 Executor.execute (C:\promise\node_modules\selenium-webdriver\lib\http.js:489:26) 在 processTicksAndRejections (internal/process/task_queues.js:93:5) 在异步 thenableWebDriverProxy.execute (C:\promise\node_modules\selenium-webdriver\lib\webdriver.js:699:17) (节点:191496)UnhandledPromiseRejectionWarning:未处理的承诺 拒绝。此错误源于在异步内部抛出 没有 catch 块的函数,或者通过拒绝一个承诺 不使用 .catch() 处理。 (拒绝 ID:1)(节点:191496)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。在 未来,未处理的承诺拒绝将终止 具有非零退出代码的 Node.js 进程。

【问题讨论】:

  • 抛出哪一行?是driver.quit,还是什么?
  • 没有给我指定行号,我用我收到的整个错误消息更新了我的问题。
  • 您在driver.getTitle().then() 上没有.catch()driver.get("www.google.com").then() 上没有 .catch()。可能这些都应该链接在一起(通过返回内部承诺),然后您在顶层有一个.catch()。就像现在一样,你只有一个.catch() 在中间层。

标签: javascript node.js selenium promise


【解决方案1】:

不管抛出了什么,如果你有 searchTextOnGoogle 返回一个与内部所有异步操作正确链接的 Promise,然后在调用 searchTextOnGoogle 时调用 .catch,所有错误都应该被正确捕获。使用异步函数也可以使内容更具可读性:

const delay = ms => new Promise(res => setTimeout(res, ms));
async function searchTextOnGoogle() {
  var driver = new webdriver.Builder().forBrowser("chrome").build();

  await driver.get("www.google.com");
  await driver.findElement(webdriver.By.linkText("Automation")).click();
  const title = await driver.getTitle();
  await delay(5000);
  console.log(title);
  await driver.quit();
}

searchTextOnGoogle()
  .catch(console.log);

请注意,.quit 也返回一个 Promise,您需要将 setTimeout 内的异步操作与外部 Promise 链正确链接。

错误可能是由以下行引起的:

driver.get("www.google.com");

docs say.get 的参数应该是完全限定的 URL,因此解决方案可能是将其更改为:

driver.get("https://www.google.com");

或类似的东西。

【讨论】:

  • 您是否尝试将完全限定的 URL 传递给 .get
【解决方案2】:

您的代码的问题在于它没有正确链接。你调用不同函数的方式,你每次都必须有 catch !相反,您可以按照@CertainPerformance 的建议创建一系列承诺。然后,您可以在链的末尾只使用一个.catch。参考如下:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises#Chaining

【讨论】:

    猜你喜欢
    • 2019-10-13
    • 2018-09-14
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    相关资源
    最近更新 更多