当操作中有一个数字时,Redux-promise 没有解决一个承诺

Posted

技术标签:

【中文标题】当操作中有一个数字时,Redux-promise 没有解决一个承诺【英文标题】:Redux-promise not resolving a promise when in the action there is a number 【发布时间】:2018-12-31 07:37:10 【问题描述】:

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

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

动作创建者:

 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 中真正解决这个承诺?

【问题讨论】:

我认为这是因为操作不是 FSA-compliant:“操作不得包含类型、有效负载、错误和元数据以外的属性。” 这很有意义!除了添加具有固定投票数的数据文件夹之外,您对如何包含此类信息有任何建议吗? 【参考方案1】:

根据redux-promise 的文档,它需要一个promise 或一个Flux Standard Action (FSA),其中payload 是一个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 解析时自动调用 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;
  

【讨论】:

不幸的是,这会导致 data.message 未定义【参考方案2】:

文档:

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

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

【讨论】:

以上是关于当操作中有一个数字时,Redux-promise 没有解决一个承诺的主要内容,如果未能解决你的问题,请参考以下文章

使用 React-Router 4 和 Redux-Promise 重定向用户

Redux-Promise 不会阻止被拒绝的 Promise

如何使用 redux 和 redux-promise 将多个 axios 调用合并到一个有效负载中?

Reducer 在使用 redux-promise 和 axios 时返回 undefined

redux-promise:未捕获的 TypeError:中间件不是函数

使用 redux-promise 调用 API 时 Redux 状态未更新