有人可以解释一下为什么返回 Axios 承诺允许进一步链接,但在应用 axios 后返回then()/catch()
方法不对?
Example:
const url = 'https://58f58f38c9deb71200ceece2.mockapi.io/Mapss'
function createRequest1() {
const request = axios.get(url)
request
.then(result => console.log('(1) Inside result:', result))
.catch(error => console.error('(1) Inside error:', error))
return request
}
function createRequest2() {
const request = axios.get(url)
return request
.then(result => console.log('(2) Inside result:', result))
.catch(error => console.error('(2) Inside error:', error))
}
createRequest1()
.then(result => console.log('(1) Outside result:', result))
.catch(error => console.error('(1) Outside error:', error))
createRequest2()
.then(result => console.log('(2) Outside result:', result))
.catch(error => console.error('(2) Outside error:', error))
<script src="https://unpkg.com/[email protected] /cdn-cgi/l/email-protection/dist/axios.min.js"></script>
https://jsfiddle.net/nandastone/81zdvodv/1/ https://jsfiddle.net/nandastone/81zdvodv/1/
我知道 Promise 方法应该返回一个要链接的值,但是为什么这两个返回方法之间存在差异?
您的第一个示例返回原始承诺。你的第二个例子返回一个不同的承诺,通过调用创建的承诺catch
.
两者之间的关键区别是:
在第二个示例中,您没有传递分辨率值,因此您返回的承诺then
解决了undefined
(返回值console.log
).
在第二个示例中,您将拒绝转换为解决方案undefined
(通过返回结果console.log
out of catch
). A catch
不抛出或返回被拒绝的承诺的处理程序会将拒绝转换为解决方案。
承诺链的关键之一是它们改变了结果;每次致电then
or catch
创建一个新的 Promise,并且它们的处理程序可以在结果通过它们时修改向下游发送的内容。
通常的模式确实是返回链的结果,但链中的函数要么故意转换结果,要么将其传递。通常情况下,你不会有catch
处理程序,除非在链的末端,除非您使用它来纠正错误条件(故意将拒绝转换为解决方案)。
如果您只想记录经过的内容,同时仍允许呼叫者看到它,但是did无论出于何种原因想要返回链的结果,您都可以这样做:
return request
.then(result => { console.log(result); return result; })
.catch(error => { console.error(error); return Promise.reject(error); });
或使用throw
:
return request
.then(result => { console.log(result); return result; })
.catch(error => { console.error(error); throw error; });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)