首页 > 解决方案 > 如何处理“不推荐使用承诺拒绝”

问题描述

我正试图用承诺来解决我的问题,我收到这个错误,抱怨未处理的承诺拒绝,但我确实有一个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);
    });
  });
}

错误:

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

整个错误信息:

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

标签: javascriptnode.jsseleniumpromise

解决方案


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

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

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

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

或类似的东西。


推荐阅读