我正在尝试使用async / await和try / catch来理解异步调用。
在下面的示例中,如何将成功的响应保存到可以在其余代码中使用的变量中?
const axios = require('axios');
const users = 'http://localhost:3000/users';
const asyncExample = async () =>{
try {
const data = await axios(users);
console.log(data); //200
}
catch (err) {
console.log(err);
}
};
//Save response on a variable
const globalData = asyncExample();
console.log(globalData) //Promise { <pending> }
答案 0 :(得分:10)
1)从asyncExample
函数
const asyncExample = async () => {
return await axios(users)
};
2)调用该函数并处理其返回的Promise
:
asyncExample().then(users => {
console.log(users)
})
.catch(err => console.error(err))
你为什么要这样处理呢?
您无法执行顶级await
(虽然a proposal也是如此) - await
必须存在于async
函数中。
将某个功能标记为async
会使其返回Promise
。您可以在顶层处理Promise
,就像我上面那样。
答案 1 :(得分:0)
try..catch
创建一个新的块范围。使用let
在data
之前定义try..catch
,而不是来自const
函数调用的return
,data
asyncExample
(async() => {
const users = 123;
const asyncExample = async() => {
let data;
try {
data = await Promise.resolve(users);
} catch (err) {
console.log(err);
}
return data;
};
//Save response on a variable
const globalData = await asyncExample();
console.log(globalData);
// return globalData;
})();
答案 2 :(得分:0)
我与您有相同的问题,并找到了这篇文章。经过2天的尝试,我终于找到了一个简单的解决方案。
根据{{3}},async
函数将仅返回Promise
对象而不是值。要访问Promise
的响应,必须使用.then()
方法或await
才能返回Promise的结果对象,而不是Promise本身。
要从await
更改变量,您可以访问并更改要在异步函数中分配的变量,而不是从异步函数中返回。
//Save response on a variable
var globalData;
const asyncExample = async () =>{
try {
const data = await axios(users);
globalData = data; // this will change globalData
console.log(data); //200
}
catch (err) {
console.log(err);
}
};
asyncExample();
但是,如果执行此操作,则可能会得到未定义的输出。
asyncExample();
console.log(globalData) //undefined
由于asyncExample()
是async
函数,因此当调用console.log
时asyncExample()
尚未完成,因此globalData
仍未分配。完成console.log
之后,以下代码将调用asyncExample()
。
const show = async () => {
await asyncExample();
console.log(globalData);
}
show();
答案 3 :(得分:-2)
因为事件是异步发生的,所以你需要绑定一个回调/保证。我将假设它返回一个承诺。
const axios = require('axios');
const users = 'http://localhost:3000/users';
const asyncExample = async () =>{
try {
const data = await axios(users);
console.log(data); //200
}
catch (err) {
console.log(err);
}
};
//Save response on a variable
const globalData = asyncExample().then( (success, err) => {
if (err) { console.error(err); }
console.log(success)
}
答案 4 :(得分:-2)
只需使用回调/承诺(级联编程):
colors <- c("Red","Blue","Green")
dfsummaryall <- lapply(colors, function(x){dftmp <- df %>%
dplyr::filter(Color == x) %>% group_by(Code) %>%
summarise(x == sum(MktValue)