我有一个异步函数,它在我的代码开始时被调用,只有当它完成后才会发生进一步的事情。通常是
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()
没有被执行),它不返回任何东西,尽管.then(r => {actualStuff()})
输出了预期的内容(控制台上的hello
)。
then()
实际接收到什么?(that I don ' treturn
)
.catch
链接到Promise上会导致Promise:
- 解析从
.catch
返回的值,如果.catch
返回正常 - 拒绝,如果
.catch
本身抛出错误
const chainedPromise = somePromise.catch(() => {
// no errors here
// nothing returned
})
如果.catch
肯定没有抛出,那么chainedPromise
肯定会解析(而不是拒绝),并且由于没有返回任何内容,chainedPromise
将解析为undefined
。
initialCheck()
.then(r => {
actualStuff()
})
工作,因为initialCheck
返回一个Promise,解析(到undefined
)。
如果您从.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);
})