JavaScript promise 和 catch

javascript promise and catch

提问人:leeyh 提问时间:11/17/2023 最后编辑:PM 77-1leeyh 更新时间:11/17/2023 访问量:53

问:

我正在研究javascript承诺。第一个代码工作正常,但第二个代码出现错误。

捕获错误时,调用拒绝函数还不够吗?我不明白在这种情况下使用和不使用return语句之间的区别。

我希望不仅第一个代码,而且第二个代码都能正常工作

const f1 = () => {
  return new Promise((res, rej) => {
    setTimeout(() => {
      res("number1:complete")
    }, 2000)
  })
}

const f2 = (message) => {
  console.log(message)
  return new Promise((res, rej) => {
    setTimeout(() => {
      rej("number2:fail")
    }, 3000)
  })
}

//first code >> success
f1()
  .then(a => {
    return f2(a)
  })
  .catch(console.log)
  
//second code >> error
f1()
  .then(a => {
    f2(a)
  })
  .catch(console.log)

javascript promise try-catch

评论


答:

1赞 Shanu T Thankachan 11/17/2023 #1

在第二个代码片段中,缺少 return 语句

then(a => { return f2(a) }) 

评论

1赞 Rory McCrossan 11/17/2023
OP 知道这一点,这就是为什么他们要问这个问题:When catching errors, isn't it sufficient for the reject function to be called? I don't understand the difference between using and not using the return statement in this context.
3赞 Vivick 11/17/2023 #2

reject确实使相关承诺被拒绝,但仅此而已。

在第二个示例中,由于您没有返回 promise,因此不会影响生成的 promise。

你从 your 得到的 promise 会立即得到解决,因为它隐式返回 。.thenundefined

.catch仅适用于已解析的 Promise 对象。它不控制任何关于另一个承诺的任何事情,这个承诺在某个地方被“分离”了。

评论

1赞 aarvinr 11/17/2023
这是正确的 - 承诺被拒绝,但因为 返回 ,它没有任何可以传递的东西:请参阅此文档.then()undefined
1赞 David 11/17/2023 #3

在这种情况下,如果没有语句,则永远不会观察到。通过返回此处:returnPromisePromise

.then(a => {
  return f2(a)
})

这允许 promise 处理程序链(对 的任何额外调用,对 的任何调用)观察其结果。如果不返回它,则对 的调用不会被观察到,因为没有或附加到它。.then().catch()Promisef2().then().catch()


一个非常常见的实际示例是调用以下结果:.json()fetch()

fetch(someUrl)
  .then(result => {
    return result.json();
  })
  .then(data => {
    // do something with data
  });

通过返回 from,您可以在整个链中的后续调用中使用它。如果不归还它,就没有什么可跟进的。Promiseresult.json()Promise.then()