Javascript 如何在异步函数中从该返回对象提取数据?
我正在尝试用JavaScript做一些工作——我从一个异步函数调用一个异步函数,如下所示Javascript 如何在异步函数中从该返回对象提取数据?,javascript,reactjs,react-native,Javascript,Reactjs,React Native,我正在尝试用JavaScript做一些工作——我从一个异步函数调用一个异步函数,如下所示 useEffect(() => { (async () => { await asyncFunction(); // do stuff })(); }, []); 异步函数如下所示 const asyncFunction = (dispatch) => { return async (data) => { try {
useEffect(() => {
(async () => {
await asyncFunction();
// do stuff
})();
}, []);
异步函数如下所示
const asyncFunction = (dispatch) => {
return async (data) => {
try {
const response = await APICall();
dispatch({ type: "search", payload: response.data });
}
// error handling
}
asyncFunction分派给一个reducer,该reducer返回return{errorMessage:,data:action.payload}代码>
在我自己的测试中,我看到console.log(asyncFunction())
返回承诺,而console.log(await asyncFunction())
不返回任何内容
我注意到的一件奇怪的事情是,当在程序的每个部分中放置console.log语句时,首先打印函数调用的承诺(在useffect块中),然后是我添加的console.log语句中关于return{errorMessage:,data:action.payload}的reducer中的数据代码>
所以我的问题是,我如何访问这些数据?我在这里查看了一些其他线程,它们建议使用。然后,但没有成功。有没有一种方法可以在不传入回调函数的情况下执行此操作(这样做意味着我需要重新构造整个程序)
这篇文章有点长,所以如果您有任何问题,或者需要我的程序的其他部分,请告诉我。AsyncFunction返回的是一个函数,而不是来自API调用的数据。如果我正确理解您的问题,您可以做的是从调用中返回响应并删除初始return语句。您可以执行相同的过程,而无需返回函数并直接完成其中的过程
按如下方式更改使用效果代码:
useEffect(() => {
(async () => {
await asyncFunction(dispatch);
// do stuff
})();
}, []);
因为在您提到的函数中,您将数据发送到reducer,而不是返回数据。所以你可以在那里做处理工作
如果您想返回一些数据,可以参考以下代码:
以前的代码:
const asyncFunction = (dispatch, data) => {
return new Promise((resolve, reject) => {
APICall()
.then((reponse)=>{
dispatch({ type: "search", payload: response.data });
//This will return value to the calling function. This will act as a return statement
resolve(response);
})
.catch((err)=>{
//This will be executed if there is any error.
reject(err)
})
})
更改了代码(正如@Bergi所说,以避免承诺构造函数反模式):
这是从异步函数返回数据的最佳方式。我可能完全错了,但我认为您可能会在返回异步函数时遇到问题
另外,看起来您可能正在调用asyncFunction(在useEffect钩子内),而没有用于分派的值?在这里:
(async () => {
await asyncFunction();
// do stuff
我按照您的计划为API调用返回了一个自定义挂钩:
.
希望它能有所帮助 在等待异步函数()中代码>您没有将减速机的分派作为参数传递。你能分享你的组件的完整代码吗,尤其是你想使用数据的部分?避免使用@Bergi我希望在编辑后的响应中避免使用promise构造函数反模式
useEffect(() => {
let mounted = true;
APICall()
.then((response) => {
if (mounted) {
dispatch({ type: "search", payload: response.data });
//do some stuff here
}
})
.catch((err) => {
//handle error here
})
return () => mounted = false;
}, []);
(async () => {
await asyncFunction();
// do stuff