Redux-promise 在操作中有一个数字时不解决承诺

Redux-promise not resolving a promise when in the action there is a number

我目前正在开发一个复制 Instagram 的应用程序。它与 React-Redux 一起工作,通过 axios 调用外部 API 来获取实际上是博客文章的照片。我还需要为每个人传递喜欢的数量(因此为 0),我在我的 fetchPhotos 动作创建者中添加了它,这会导致我的应用程序崩溃。只要动作创建者只返回类型和有效负载,这就可以正常工作。

当我在控制台记录操作时,实际上结果是承诺现在没有得到解决,因此出现了错误。

动作创作者:

 export function fetchPhotos() {
  const response = axios.get("https://dog.ceo/api/breed/husky/images");
  return {
    type: FETCH_PHOTOS,
    payload: response,
    likes: 0
  };
}

减速器:

export default function(state = [], action) {  
  switch(action.type) {
    case FETCH_PHOTOS:
    console.log(action);
      return [action.payload.data.message, action.likes];
    default:
      return state;
  }  
}

在应用程序中:

const history = createBrowserHistory();

const store = createStore(
  connectRouter(history)(reducers),
  compose(applyMiddleware(routerMiddleware(history), ReduxPromise))
);

有没有办法让动作创建者在 action.payload 中真正解决这个承诺?

根据 redux-promise 的文档,它需要一个 promise 或一个 Flux Standard Action (FSA),其中负载是一个 promise。由于添加 'likes' 属性 会破坏 FSA 合规性,因此它必须以某种方式位于有效载荷内。

我建议直接从动作创建者返回一个承诺,其中嵌入了 'likes' 属性,如下所示:

export async function fetchPhotos() {
  const response = await axios.get("https://dog.ceo/api/breed/husky/images");
  return {
    type: FETCH_PHOTOS,
    payload: {
      data: response.data,
      likes: 0
    }
  };
}

redux-promise 会在 promise resolve 时自动调用 dispatch,你可以在你的 reducer 中使用以下代码:

export default function (state = [], action) {
  switch (action.type) {
    case FETCH_PHOTOS:
      console.log(action);
      return [action.payload.data.message, action.payload.likes];
    default:
      return state;
  }
}

文档:

正如@fshauge 提到的,有效载荷必须是一个承诺,添加 属性 的点赞会破坏它。我在issues中找到了this,解决了我的问题。点赞 属性 实际上必须进入 meta,因此正确运行的最终结果是:

export function fetchPhotos() {
  const response = axios.get("https://dog.ceo/api/breed/husky/images");
  return {
    type: FETCH_PHOTOS,
    payload: response,
    meta: {
      likes: 0
    }
  };
}