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

Posted

技术标签:

【中文标题】Redux-Promise 不会阻止被拒绝的 Promise【英文标题】:Redux-Promise does not prevent rejected promises 【发布时间】:2018-08-17 01:15:00 【问题描述】:

Redux-Promise 说: 如果它收到一个 Promise,它将发送该 Promise 的已解析值。 如果 Promise 被拒绝,它不会发送任何东西。

但是当我运行下面的代码并故意做一些事情来让承诺在行动中被拒绝时,我在reducer上也得到了被拒绝的承诺!它不应该被发送到减速器吗? 请不要只告诉我解决方法,而是告诉我当 Redux-Promise 这么说时为什么会发生这种情况。

行动:

  const responce = axios.get(API_URL);  
  console.log(responce);
    return (
        
            type: FETCH_WEATHER,
            payload: responce,
        
    );

回应 ^ 是:

减速器:

   export default (state = initalState, action) => 

        switch (action.type) 
            case FETCH_WEATHER:
            console.log(action.payload);
                return (
                    [action.payload.data, ...state]
                );
            default: return (state);
        
    

action.payload ^ 是:

【问题讨论】:

【参考方案1】:

重复短语:

如果它收到一个promise,它将发送promise 的resolved 值。如果 Promise 被拒绝,它不会发送任何东西。

如果它收到一个 Flux 标准操作,其有效载荷是一个承诺,它会要么

使用已解决的承诺值发送操作副本,并将状态设置为成功。 使用 promise 的拒绝值发送操作副本,并将状态设置为错误。

所以,有两种不同的方式来使用这个中间件:

// dispatch a promise directly
dispatch(somePromise);

// dispatch a promise as an action payload
dispatch(type : "SOME_ACTION", payload : somePromise)

“如果 Promise 拒绝,将不发送任何东西”短语指的是第一种用法 - 将 Promise 直接传递给 dispatch()。您正在以第二种方式使用它 - 将 Promise 作为有效负载传递。

【讨论】:

那么在第一种情况下,我们派发promise本身,如何处理reducer部分?我的意思是没有type 怎么把它放到正确的地方? 在第一种情况下,redux-promise 看到“action”实际上是一个 Promise,并运行 promise.then(dispatch),因此“调度了 promise 的解析值”。

以上是关于Redux-Promise 不会阻止被拒绝的 Promise的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止我的推送与我的公开 PR 合并?

由于“中继访问被拒绝”而被阻止的 Azure Sql 托管实例数据库邮件到外部电子邮件

减速器没有被触发(redux-promise with axios)

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

由于 1.2 苹果指南,应用程序被拒绝

Elastic Beanstalk 权限被拒绝