从函数返回一个 Axios Promise
Returning an Axios Promise from function
有人可以解释一下为什么 return 使用 Axios promise 可以进一步链接,但是 return 在应用 then()/catch()
方法之后却不能吗?
示例:
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/axios@0.16.1/dist/axios.min.js"></script>
https://jsfiddle.net/nandastone/81zdvodv/1/
我知道 Promise 方法应该 return 一个要链接的值,但是为什么这两个 return 方法之间存在差异?
你的第一个例子 return 是最初的承诺。您的第二个示例 return 是一个 不同的 承诺,通过调用 catch
.
创建的承诺
两者之间的关键区别是:
在你的第二个例子中,你没有传递分辨率值,所以你的 then
所承诺的 return 被 undefined
解决了( console.log
的 return 值)。
在你的第二个例子中,你将拒绝转化为决议undefined
(通过 returning console.log
的结果 catch
).不抛出 catch
处理程序或 return 被拒绝的承诺将拒绝转化为解决方案。
承诺链的关键之一是它们转换结果;每次调用 then
或 catch
都会创建一个新的承诺,并且它们的处理程序可以在结果通过它们时修改向下游发送的内容。
通常的模式确实是 return 链的结果,但链中的函数要么有意地转换结果,要么传递它。通常,除了链的终端外,您不会有 catch
处理程序,除非您使用它来纠正错误情况(有意将拒绝转换为解决方案)。
如果您只想记录通过的内容,同时仍允许调用者看到它,但 确实 出于任何原因想要 return 链的结果,您会这样做:
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; });
有人可以解释一下为什么 return 使用 Axios promise 可以进一步链接,但是 return 在应用 then()/catch()
方法之后却不能吗?
示例:
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/axios@0.16.1/dist/axios.min.js"></script>
https://jsfiddle.net/nandastone/81zdvodv/1/
我知道 Promise 方法应该 return 一个要链接的值,但是为什么这两个 return 方法之间存在差异?
你的第一个例子 return 是最初的承诺。您的第二个示例 return 是一个 不同的 承诺,通过调用 catch
.
两者之间的关键区别是:
在你的第二个例子中,你没有传递分辨率值,所以你的
then
所承诺的 return 被undefined
解决了(console.log
的 return 值)。在你的第二个例子中,你将拒绝转化为决议
undefined
(通过 returningconsole.log
的结果catch
).不抛出catch
处理程序或 return 被拒绝的承诺将拒绝转化为解决方案。
承诺链的关键之一是它们转换结果;每次调用 then
或 catch
都会创建一个新的承诺,并且它们的处理程序可以在结果通过它们时修改向下游发送的内容。
通常的模式确实是 return 链的结果,但链中的函数要么有意地转换结果,要么传递它。通常,除了链的终端外,您不会有 catch
处理程序,除非您使用它来纠正错误情况(有意将拒绝转换为解决方案)。
如果您只想记录通过的内容,同时仍允许调用者看到它,但 确实 出于任何原因想要 return 链的结果,您会这样做:
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; });