Javascript 调用异步函数的客户端代码是否需要使用wait?
想象一下下面假设的一个函数的最小实现,该函数使用axios执行一个简单的HTTP GET请求。这使用了Javascript 调用异步函数的客户端代码是否需要使用wait?,javascript,node.js,promise,async-await,Javascript,Node.js,Promise,Async Await,想象一下下面假设的一个函数的最小实现,该函数使用axios执行一个简单的HTTP GET请求。这使用了wait/async,如本文所述 const axios = require('axios') exports.getStatus = async id => { const resp = await axios.get( `https://api.example.com/status/${id}` ) return resp } 是否未使用wait解决承诺?是否
wait/async
,如本文所述
const axios = require('axios')
exports.getStatus = async id => {
const resp = await axios.get(
`https://api.example.com/status/${id}`
)
return resp
}
是否未使用wait
解决承诺?是否要求客户使用wait
,如下所示?假设客户机在任何时候使用异步函数时,调用该函数时也需要使用wait
,这样安全吗
// client
const { getStatus } = require('./status')
const response = await getStatus(4)
简短的回答是否定的。
标记函数async
意味着两件事:
1) 您可以在函数中使用wait
2) 函数返回一个承诺
;i、 e.您可以在其返回值上使用wait,也可以使用.then
,或Promise.all
,甚至可以忽略返回值,或者您可以使用promises执行的任何其他操作
例如,您可以执行以下操作(取决于您的用例),因为它不需要等待响应继续,因此性能可能会更好
// 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));
顺便说一句,您的第一个代码段由于使用了wait
,所以是多余的;相当于
const axios = require('axios')
exports.getStatus = id =>
axios.get(`https://api.example.com/status/${id}`);
这是因为返回等待承诺
等同于返回承诺
,两者都返回相同的承诺。关于被拒绝的承诺,有一个例外。等待被拒绝的承诺将引发异常(您可以使用try/catch
块捕获),而直接返回被拒绝的承诺不会引发异常,但您仍应处理拒绝(使用.catch
子句)。举例说明:
let promise=new promise(解析=>setTimeout(()=>resolve('2秒后解析'),2000));
让我们的承诺=()=>承诺;
让returnAwaitPromise=async()=>AwaitPromise;
returnPromise()。然后(value=>console.log('returnPromise',value));
returnAwaitPromise()。然后(value=>console.log('returnAwaitPromise',value))代码>不,不需要使用wait。异步函数返回应解析的承诺。不使用wait,只需调用.then()
,如下所示:
// client
const { getStatus } = require('./status');
getStatus(4).then((response) => {
//Do something with the response
}).catch((error) => {
//Handle possible exceptions
});
下面我将从评论中回答您的问题。getStatus
函数可以这样重写:
exports.getStatus = (id) => {
return new Promise((resolve, reject) => {
axios.get(`https://api.example.com/status/${id}`).then((resp) => {
resolve(resp);
}).catch((error) => {
reject(error);
})
});
}
它的作用与您的版本完全相同。当您串联调用异步函数时,必须解析每个返回的承诺。在您的例子中,有两种方法—一种是通过axios.get
返回的,另一种是通过getStatus
返回的 不,你不必这么做。异步函数执行并等待,直到返回错误或完成执行并返回响应 所有async
函数都使用隐式承诺返回结果。“假设客户机在任何时候使用异步函数,调用该函数时也需要使用wait,这是否安全?”-正确,假设您依赖于结果。您必须将结果作为承诺来处理,无论是使用wait
还是像这样的回调@TylerRoper这就是我困惑的地方。调用axios.get(…)
时,wait
声明不是解决了这个承诺吗?为什么消费代码也需要解决它?这里有两个承诺:一个是由axios.get
返回的(由wait
解决),另一个是由exports.getStatus
返回的。也许这是一个糟糕的类比,但想象一下你打电话给我说“打电话给当地市场,看看他们有没有面包。”。所以我打电话给他们,等待他们的回答。但你还是得等我给你答复,对吗?或者,我可以给你回电话(回电话)。谢谢你。因为axios.get()
返回了一个承诺,所以它是多余的吗?我似乎无法编辑我的第一条评论,但如果您有时间,我很想了解为什么我使用wait是多余的。添加了解释