我很困惑为什么我需要在另一个函数中再次运行async / await
示例
async function fetchData() {
try {
const result = await axios.get('http://example.com')
return result
} catch(err) {
return err
}
}
// and in another function I need to async await again
// if I want to get the value of fetchData()
// or else it will return pending promise object
function mapData() {
const data = fetchData()
console.log(data) // is a Pending Promise
}
如果我想获取数据而不是Promise对象
async function mapData() {
const data = await fetchData() // I still need to await??
console.log(data) // real value
}
我认为,如果我已经在fetchData
函数中进行了异步/等待,那么它已经返回了一个值而不是诺言,为什么我需要再次进行异步/等待以在mapData
函数中获得实际的数据?
答案 0 :(得分:3)
async
函数将始终返回Promise-一旦异步函数到达其末尾(在可能包含await
的位置之后,它就会解决)。它不会神奇地使异步代码同步;异步函数的所有使用者也必须处理其异步性。
处理消费者中的错误通常也更有意义。在这里,对于fetchData
中的错误,您似乎没有做任何特别的事情,因此您可以立即返回Promise,而不必在下游函数中await
进行>
function fetchData() {
return axios.get('http://example.com');
}
async function mapData() {
try {
const data = await fetchData()
console.log(data)
} catch(e) {
console.log('Something went wrong...');
// handle failure of fetchData
}
}
答案 1 :(得分:0)
承诺与时间有关。它们是最终将可用的值的包装器,但还没有。而且,直到该值可用为止,您才可以冻结整个应用程序。
异步/等待只是Promises上的语法糖。它使您可以编写
之类的代码async function myFunction(){
var id = await asyncMethod1();
var value = await asyncMethod2(id);
return syncMethod3(id, value);
}
代替
function myFunction(){
return asyncMethod1().then(id => asyncMethod2(id).then(value => syncMethod3(id, value)));
}
但是它并没有改变它在下面的工作方式。
因此,尽管syncMethod3
已同步,但返回值仍依赖于异步计算的值foo
和bar
。使myfunction
异步。
每个调用myFunction
的函数都需要等到myFunction
计算出它的值,等等。