当前位置: 首页 > 知识库问答 >
问题:

当一个回调不返回任何promise时,promise链是如何工作的?

戚峻
2023-03-14

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

当.then()缺少返回promise对象的适当函数时,处理将继续到链的下一个链接。因此,链可以安全地忽略每个HandlerRejection,直到final.catch()。类似地,.catch()实际上只是一个.then(),没有用于handlefulled的插槽。

考虑到:

方法promise.then()、promise.catch()和promise.finally()用于将进一步的操作与已解决的promise相关联。这些方法还返回一个新生成的promise对象,该对象可以选择性地用于链接;

当一个回调不返回任何promise时,promise链是如何工作的?

共有1个答案

祝灼光
2023-03-14

如果promise链返回一个promise,它将使用该promise的已解析(或拒绝)值调用下一个then(或catch)。如果没有,那么它将调用下一个,然后使用返回的值调用(如果没有返回值,则调用未定义的):

const myPromise = myApiCall().then(response => {
   return anotherApiCallThatReturnsAPromise(response);
}).then(secondResponse => {
   // this is the resolved value of anotherApiCall...
   return secondResponse;
}).catch(err => {
 // this error could be because myApiCall failed or because anotherApiCall... failed
})
const myPromise = myApiCall().then(response => {
   return 42
}).then(value => {
   // value is 42
}).catch(err => {
 // this error, if present, is because myApiCall failed
}) 

推断一下,让我们从第一次回调中不返回任何内容:

const myPromise = myApiCall().then(response => {
   // notice we do not return anything here
   // we just call a function - i.e. return undefined
   doSomeWorkAndReturnNothing();
}).then(value => {
   // value is undefined because nothing was returned from the previous `then`
}).catch(err => {
 // this error, if present, is because myApiCall failed
}) 

为了好玩,下面是在异步函数中使用wait的样子:

const myFunc = async () => {
   try {
     const response = await myApiCall();
     const secondResponse = await anotherApiCallThatReturnsAPromise(response);
     return secondResponse;
   } catch(err) {
     // this error could be because either of the previous two await-ed calls failed
   }

}

 类似资料:
  • 问题内容: 背景 我正在尝试学习承诺,并且我有一个希望改进的承诺链。 问题 在学习如何链接承诺时,我看不到为什么有人愿意返回承诺而不是返回其价值。 以下面的示例为例,该示例使用了Promise链接: 在这里,我必须链接2次。但是,如果我直接从方法中返回结果而不是返回Promise,则可能会执行以下操作: 问题 如您所见,我有些困惑。 鉴于实际上是异步的,是否有可能实现与我的第二个代码示例中的代码相

  • 问题内容: 我需要兑现承诺,以便可以通过封闭函数将其返回。我知道,由于正常的JavaScript范围,我可能无法按照编码的方式进行操作。有什么办法可以做到吗? 位于#1 的 console.log 会生成正确的数据。 console.log #2总是产生’a’; 任何指针将不胜感激。 问题答案: 许诺背后的基本原则之一是它是异步处理的。这意味着您无法创建承诺,然后立即在代码中同步使用其结果(例如,

  • 我正在尝试访问秒napshot.data()返回的内容,但有一个问题,如下面的评论所述。我试图创建一个异步函数,但无济于事。知道出了什么问题吗?请查看2条评论。

  • 我正在努力理解如何在Javascript中获得一个承诺的值,以便能够检查它是真的还是假的。 如果我console.log有效变量,它将返回以下内容: 在我的if语句中,我试图检查允诺值是否为真,但我不知道如何访问该值:/谁能告诉我如何检查该值吗? 谢谢

  • 问题内容: 我正在使用播放框架和Apache Kafka。 我有一个POST方法,它将消息发送到Kafka。Kafka有一个API方法 public java.util.concurrent.Future send(ProducerRecord记录,回调回调) 其中Javadoc说 异步将记录发送到主题,并在确认发送后调用提供的回调。 我正在使用play框架公开此功能。我想从Controller方

  • 我正在使用play框架和Apache Kafka。 我有一个POST方法,它向Kafka发送消息。Kafka有一个API方法 公共java.util.concurrent。未来发送(生产记录记录、回调) 其中Javadoc说 异步发送记录到主题,并在发送被确认时调用提供的回调。 我将使用play框架公开此功能。我想返回一个<代码>promise