catch() return 保护的 Promise 是什么意思?

What does a Promise guarded by a catch() return?

我有一个在我的代码开头调用的异步函数,只有当它完成时,才会发生进一步的事情。它通常类似于

const initialCheck = () => {
  return fetch('https://reqres.in/api/users')
    .then(r => {
      // do things
      return r
    })
}

const actualStuff = () => {
  console.log('hello')
}

initialCheck()
  .then(r => {
    actualStuff()
  })

此初始检查的目的是确保 HTTP 端点 (https://reqres.in/api/users) 实际上是可访问的。因此,它应该考虑连接问题,我的解决方案是 catch() 可能的错误:

const initialCheck = () => {
  return fetch('https://thissitedoesnotexistihopeatleast')
    .then(r => {
      // do things when the endpoint is available
      return r
    })
    .catch(err => {
    // do something when the endpoint is not availble
    // nothing is returned
    })
}

const actualStuff = () => {
  console.log('hello')
}

initialCheck()
  .then(r => {
    actualStuff()
  })

我的问题:为什么上面的代码有效?

catch() 被执行(而那个函数中的 then() 没有),它没有 return 任何东西,尽管 .then(r => {actualStuff()}) 输出了预期的内容( hello 在控制台上)。

then() 实际收到了什么? (那个我没有return

链接到 Promise 上的 .catch 将产生一个 Promise:

  • 解析为.catch返回的值,如果.catch returns正常
  • 如果 .catch 本身抛出错误
  • ,则拒绝并返回错误

所以

const chainedPromise = somePromise.catch(() => {
  // no errors here
  // nothing returned
})

如果 .catch 肯定不会抛出,那么 chainedPromise 肯定会解析(而不是拒绝),并且由于没有任何返回,chainedPromise 将解析为 undefined.

所以

initialCheck()
  .then(r => {
    actualStuff()
  })

之所以有效,是因为 initialCheck returns 解决了(到 undefined)的 Promise。

如果您从 .catch 返回了一些东西,并且 .catch 被输入了,您会在 .then 之后看到它链接到它上面:

const initialCheck = () => {
  return fetch('https://doesnotexist')
    .catch(() => {
      return 'foo';
    });
}

const actualStuff = (r) => {
console.log(r);
  console.log('r is foo:', r === 'foo')
}

initialCheck()
  .then(r => {
    actualStuff(r);
  })