假设您有这样一个问题:您正在进行一个异步调用,并且需要从原始函数返回该调用的结果。
像这样:
const mainFunction = () => {
const result = asynchronousFunction()
return result
}
但是,异步函数()在其中执行一些异步调用(例如fetch()调用),并且不能直接返回结果值。也许在内部,它需要等待一个承诺,或者一个回调。是这样的:
const asynchronousFunction = () => {
return fetch('./file.json').then(response => {
return response
})
}
该如何解决这个问题呢?
async/await是最直接的解决方案。你使用的是await关键字,而不是基于promise的方法,就像我们以前使用的:
const asynchronousFunction = async () => {
const response = await fetch('./file.json')
return response
}
在这种情况下,在mainFunction中,我们需要将async添加到函数签名中,并在调用asynousfunction()之前等待:
const mainFunction = async () => {
const result = await asynchronousFunction()
return result
}
现在返回一个promise,因为它是一个async函数:
mainFunction() //returns a Promise
所以为了得到结果,你可以使用IIFE这样调用:
(async () => {
console.log(await mainFunction())
})()
代码看起来像您从其他语言中使用的同步代码,但它是完全异步的。
另一种方法是使用回调。但是在使用async/await时,我们可以只修改异步函数()代码,在这种情况下,我们必须这样做
asynchronousFunction()
?代码mainFunction()
?代码这是一个例子。异步函数()接收一个新函数作为参数,我们称之为回调。调用它传递响应对象:
const asynchronousFunction = callback => {
return fetch('./file.json').then(response => {
callback(response)
})
}
这个函数由mainFunction传递
const mainFunction = () => {
const callback = result => {
console.log(result)
}
asynchronousFunction(callback)
}
最后一个难题是调用mainFunction的函数。因为我们不能直接从mainFunction返回响应,因为我们是异步获取的,所以调用函数必须改变处理它的方式。
因此,代替使用const result = mainFunction(),我们可以这样:
const callbackFunction = result => {
console.log(result)
}
const mainFunction = callback => {
asynchronousFunction(callback)
}
//call the code
mainFunction(callbackFunction)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。