什么是未处理的PromiseRejectionWarning:Error



我粘贴了两个几乎相同的代码,但有一点不同,一个工作得很好,但另一个给出了未处理的PromiseRejectionWarning

async function promise () {
return new Promise((resolve, reject) => {
throw new Error();
resolve();
reject();
})
}
promise().then((data) =>{console.log('then')}).catch((err)=>{console.log('from the catch')});

输出为:

> node index.js
from the catch

但对于这种情况,

function promise () {
return new Promise(async (resolve, reject) => {
throw new Error();
resolve();
reject();
})
}
promise().then((data) =>{console.log('then')}).catch((err)=>{console.log('err')});

输出类似于

> node index.js
(node:98195) UnhandledPromiseRejectionWarning: Error
at /home/parthiv/Projects/exp/index.js:47:11
at new Promise (<anonymous>)
at promise (/home/parthiv/Projects/exp/index.js:46:10)
at Object.<anonymous> (/home/parthiv/Projects/exp/index.js:53:1)
at Module._compile (internal/modules/cjs/loader.js:1085:14)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
at Module.load (internal/modules/cjs/loader.js:950:32)
at Function.Module._load (internal/modules/cjs/loader.js:790:12)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)
at internal/main/run_main_module.js:17:47
(Use `node --trace-warnings ...` to show where the warning was created)
(node:98195) 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(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:98195) [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.

有人能解释promise中异步函数的这种行为吗?

您已经将async函数传递到Promise构造函数中,这不是正确的做法。async函数的返回值是未处理的。

Promise构造函数是为同步使用而设计的,它完全忽略了它的返回值。如果您在传递给Promise构造函数的函数中throw,Promise构造函数将返回一个被拒绝的Promise;这就是你在第一个例子中看到的行为。如果函数返回一个值,甚至是Promise,那也没关系:该值将被丢弃。

关于执行器,了解以下内容很重要:

  • executor返回值被忽略
  • 如果在执行器中抛出错误,则promise将被拒绝

async函数将其returnthrow调用转换为Promise解析,但async函数始终返回Promise。因此,在第二个示例中,您的throw导致一个被拒绝的Promise,,然后该Promise被取消处理;返回值如上所述被完全丢弃。如果不是因为未处理的PromiseRejectionWarning,您的throw new Error()将不会出现任何症状,并且您的promise()返回的承诺将永远无法解决。

如果您希望promise()返回promise,您可以只返回内部async函数的返回值,或者(甚至更好(使promise()本身成为一个异步函数。如果确实需要resolve/reject调用,则可以始终从函数内部调用return new Promise();每当async函数或.then()处理程序返回Promise时,就会展开该返回值。

相关内容

  • 没有找到相关文章

最新更新