想象一下以下假设的,最小的函数实现,该函数使用axios执行简单的HTTP GET请求。用法await/async
如帖子中所述。
const axios = require('axios')
exports.getStatus = async id => {
const resp = await axios.get(
`https://api.example.com/status/${id}`
)
return resp
}
诺言是否无法使用解决await
?要求客户使用await
如下图所示的内容吗?是否可以安全地假设客户端何时使用异步函数,并且await
在调用该函数时也需要使用异步函数?
// client
const { getStatus } = require('./status')
const response = await getStatus(4)
简短的回答,不。标记函数async
意味着两件事:
1)您可以await
在函数内部使用。
2)函数返回一个promise
;也就是说,您可以在其返回值上使用await,或者可以使用.then
,或Promise.all
,甚至可以忽略该返回值,或者可以使用promise进行任何其他操作。
例如,您可以执行以下操作(具体取决于您的用例),因为它不需要等待响应继续,因此可以提高性能。
// client
const { getStatus } = require('./status')
const response4 = getStatus(4);
const response5 = getStatus(5);
// do stuff that don't rely on the responses.
response4.then(response => myOutput.setFirstOutput(response));
response5.then(response => myOutput.setSecondOutput(response));
顺便说一句,您的第一个代码片段对await
;的使用是多余的。相当于
const axios = require('axios')
exports.getStatus = id =>
axios.get(`https://api.example.com/status/${id}`);
这是因为return await promise
等于return promise
,都返回相同的诺言。关于被拒绝的承诺有一个例外。等待被拒绝的诺言将引发异常(您可以使用try/catch
块捕获),而直接返回被拒绝的诺言不会引发异常,但您仍应处理拒绝(带有.catch
子句)。为了显示:
let promise = new Promise(resolve => setTimeout(() => resolve('resolved after 2 seconds'), 2000));
let returnPromise = () => promise;
let returnAwaitPromise = async () => await promise;
returnPromise().then(value => console.log('returnPromise,', value));
returnAwaitPromise().then(value => console.log('returnAwaitPromise,', value));
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句