【问题标题】:Can a native resolve function throw?本机解析函数可以抛出吗?
【发布时间】:2018-04-09 15:19:49
【问题描述】:

假设我在 Chrome 上。我这样做:

new Promise(function (resolve, reject) {
    // ... do some work
    resolve('foo');
}).then(doStuff).then(doMoreStuff);

调用“resolve”会引发异常吗?有什么 doStuff 或 doMoreStuff 可以做的,这会使“解决”抛出异常?

【问题讨论】:

  • 没有。如果您调用 resolve,则承诺已解决,并且永远不会再次更改它的状态。因此,doStuff 或 doMoreStuff 中发生的任何事情都无法将状态从已解决变为已拒绝
  • doStuffdoMoreStuff 直到 之后 resolve 被调用后才会执行。 javascript 中没有时间旅行:p
  • 我不确定'resolve'是否只是“设置一个标志并返回”,或者它是否“设置一个标志并运行任何等待设置该标志的工作”。

标签: javascript exception-handling promise


【解决方案1】:

如果doStuffdoMoreStuff 抛出异常,它将在调用.then() 的上下文中抛出,而不是函数体。在调用.then() 时,该函数已返回。那里的代码是异步执行的。

如果你想捕获异常,你需要在对doStuff的调用周围加上try

new Promise(function (resolve, reject) {
    // ... do some work
    resolve('foo');
}).then(x => {
try {
    doStuff(x);
} catch (e) {
    console.log("Error in doStuff");
}).then(doMoreStuff);

【讨论】:

  • 如果dostuff 抛出一个错误,它不会被这个catch捕获。你最终会得到一个未经处理的拒绝。例如如果let doStuff = () => {throw(new Error("Whoops"))} 会发生什么?
  • 你说得对,我忘了.then()是异步执行的。
猜你喜欢
  • 2021-06-08
  • 1970-01-01
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多