Redux Actions必须是普通对象.使用自定义中间件进行异步操作

use*_*286 5 asynchronous react-native redux redux-thunk react-redux

我收到错误"Redux Actions必须是普通对象.使用自定义中间件进行异步操作." 使用以下代码.

export const getFriends = () => async(): Action => {

  const requestConfig = {
    httpMethod: 'GET',
    version: 'v2.7',
  };
  let hasMore = false;
  let friends = [];

  do {
    const infoRequest = new GraphRequest(
    '/me/friends',
    requestConfig,
    (error, result) => {
      if (error) {
        alert('Error fetching data facebook friends');
      } else {
        result.data.forEach((value) => {
            friends.push(value)
        });
        if (result.paging && result.paging.next) {
          hasMore = true;
          requestConfig.parameters.after = result.paging.cursors.after;
        } else {
          hasMore = false;
        }
      }
    });
    await new GraphRequestManager().addRequest(infoRequest).start();
  } while (hasMore);
  return {
    type: 'GET_FRIENDS',
    payload: friends    // this is empty because there is no await on GraphAPI
  };
};
Run Code Online (Sandbox Code Playgroud)

如果我删除了异步并等待,那么返回的朋友是空的,因为在返回GraphAPI调用之前返回了函数调用

export const getFriends = () => (): Action => {

  const requestConfig = {
    httpMethod: 'GET',
    version: 'v2.7',
  };
  let hasMore = false;
  let friends = [];

  do {
    const infoRequest = new GraphRequest(
    '/me/friends',
    requestConfig,
    (error, result) => {
      if (error) {
        alert('Error fetching data facebook friends');
      } else {
        result.data.forEach((value) => {
            friends.push(value)
        });
        if (result.paging && result.paging.next) {
          hasMore = true;
          requestConfig.parameters.after = result.paging.cursors.after;
        } else {
          hasMore = false;
        }
      }
    });
    new GraphRequestManager().addRequest(infoRequest).start();
  } while (hasMore);
  return {
    type: 'GET_FRIENDS',
    payload: friends    // this is empty because there is no await on GraphAPI
  };
};
Run Code Online (Sandbox Code Playgroud)

Tra*_*ite 2

该错误的含义正如其听起来的那样。Redux 需要一个普通对象。我看到标有 redux-thunk 的问题。如果您使用的是 redux-thunk,可能您没有正确设置中间件的存储。如果您不使用 redux-thunk 那么我会推荐它作为分派异步操作的首选库。

这将使您深入了解如何调度非普通对象的 redux 操作。 如何调度一个超时的 Redux 操作?

编辑:您缺少实际的调度,并试图简单地返回普通对象...需要返回调度...类似于以下内容(尚未测试,但应该让您接近):

    export const getFriends = () => {
      return (dispatch) => {
        const requestConfig = {
          httpMethod: 'GET',
          version: 'v2.7',
        };
        let hasMore = false;
        let friends = [];

        do {
          const infoRequest = new GraphRequest(
            '/me/friends',
            requestConfig,
            (error, result) => {
              if (error) {
                alert('Error fetching data facebook friends');
              } else {
                result.data.forEach((value) => {
                    friends.push(value)
                });
                if (result.paging && result.paging.next) {
                  hasMore = true;
                  requestConfig.parameters.after = result.paging.cursors.after;
                } else {
                  hasMore = false;
                  return dispatch({
                    type: 'GET_FRIENDS',
                    payload: friends               
                  });
                }
              }
          });
          await new GraphRequestManager().addRequest(infoRequest).start();
        } while (hasMore);
      }
    };
Run Code Online (Sandbox Code Playgroud)