Javascript 如何在异步函数中从该返回对象提取数据?

Javascript 如何在异步函数中从该返回对象提取数据?,javascript,reactjs,react-native,Javascript,Reactjs,React Native,我正在尝试用JavaScript做一些工作——我从一个异步函数调用一个异步函数,如下所示 useEffect(() => { (async () => { await asyncFunction(); // do stuff })(); }, []); 异步函数如下所示 const asyncFunction = (dispatch) => { return async (data) => { try {

我正在尝试用JavaScript做一些工作——我从一个异步函数调用一个异步函数,如下所示

  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