异步action和redux-thunk理解

异步action一般指的就是异步action创建函数

action创建函数分为同步action创建函数和异步action创建函数

同步action创建函数(最常见的):

function requestPosts(subreddit) {
  return {
    type: REQUEST_POSTS,
    subreddit
  }
}

异步action创建函数(如果利用了redux-thunk,也叫thunk action创建函数,通过使用指定的 middleware,action 创建函数除了返回 action 对象外还可以返回函数。这时,这个 action 创建函数就成为了 thunk):

// 来看一下我们写的第一个 thunk action 创建函数!
// 虽然内部操作不同,你可以像其它 action 创建函数 一样使用它:
// store.dispatch(fetchPosts(‘reactjs‘))

export function fetchPosts(subreddit) {

  // Thunk middleware 知道如何处理函数。
  // 这里把 dispatch 方法通过参数的形式传给函数,
  // 以此来让它自己也能 dispatch action。

  return function (dispatch) {  //redux-thunk使得可以dispatch该函数

    // 首次 dispatch:更新应用的 state 来通知
    // API 请求发起了。

    dispatch(requestPosts(subreddit))

    // thunk middleware 调用的函数可以有返回值,
    // 它会被当作 dispatch 方法的返回值传递。

    // 这个案例中,我们返回一个等待处理的 promise。
    // 这并不是 redux middleware 所必须的,但这对于我们而言很方便。

    return fetch(`http://www.subreddit.com/r/${subreddit}.json`)
      .then(
        response => response.json(),
        // 不要使用 catch,因为会捕获
        // 在 dispatch 和渲染中出现的任何错误,
        // 导致 ‘Unexpected batch number‘ 错误。
        // https://github.com/facebook/react/issues/6895
         error => console.log(‘An error occurred.‘, error)
      )
      .then(json =>
        // 可以多次 dispatch!
        // 这里,使用 API 请求结果来更新应用的 state。

        dispatch(receivePosts(subreddit, json))
      )
  }
}

通过使用redux-thunk中间件,使得可以dispacth一个函数,该函数被thunk中间件调用,且该函数的返回值会作为dispatch方法的返回值,该例中最后返回的是一个promise

store.dispatch(fetchPosts(‘reactjs‘)).then(() => console.log(store.getState()))

原文地址:https://www.cnblogs.com/ruoshuisanqian/p/10868659.html

时间: 2024-11-13 07:15:40

异步action和redux-thunk理解的相关文章

redux学习日志:关于异步action

当我们在执行某个动作的时候,会直接dispatch(action),此时state会立即更新,但是如果这个动作是个异步的呢,我们要等结果出来了才能知道要更新什么样的state(比如ajax请求),那就没办法了,所以此时要用异步action. 这里一定要引入redux-thunk这个库,通过使用中间件Middleware来把从action到reducer这个过程给拆分成很多个小过程,这样我们就能在中间随时查找此刻的状态以及执行一些其他动作了.具体的Middleware和redux-thunk以后再

Redux thunk中间件

redux-thunk https://github.com/reduxjs/redux-thunk Why Do I Need This? Thunks are the recommended middleware for basic Redux side effects logic, including complex synchronous logic that needs access to the store, and simple async logic like AJAX requ

ASP.NET MVC什么时候使用异步Action

在没有使用异步Action之前,在Action内,比如有如下的写法: public ActionResult Index() { CustomerHelper cHelper = new CustomerHelper(); List<Customer> result = cHelper.GetCustomerData(); return View(result); } 以上,假设,GetCustomerData方法是调用第三方的服务,整个过程都是同步的,大致是: →请求来到Index这个Act

ASP.NET MVC下的异步Action的定义和执行原理

Visual Studio提供的Controller创建向导默认为我们创建一个继承自抽象类Controller的Controller类型,这样的Controller只能定义同步Action方法.如果我们需要定义异步Action方法,必须继承抽象类AsyncController.这篇问你讲述两种不同的异步Action的定义方法和底层执行原理.[本文已经同步到<How ASP.NET MVC Works?>中] 目录 一.基于线程池的请求处理 二.两种异步Action方法的定义     XxxAs

异步Action之AsyncController

1.为什么需要异步Action 池的模式一直是我们处理对象频繁创建.销毁时采取的一种策略.就像一个大型图书馆,当我们需要某种图书的时候只需要到里面寻找就可以了,使用完毕之后放回:而不是每次想要获取的时候通知印刷厂为我们印刷一本.ASP.NET对HTTP的请求处理也是采用了线程池的方式,每个web应用内部都维护着一个线程池,当请求到达之后ASP.NET会从线程池中取出一个空闲的线程来专门处理这次请求,请求结束之后线程也不是被直接销毁而是放回到线程池供其他请求使用.需要注意的是线程池有一个最大容量如

ASP.NET MVC下的异步Action的定义和执行原理[转]

http://www.cnblogs.com/artech/archive/2012/06/20/async-action-in-mvc.html Visual Studio提供的Controller创建向导默认为我们创建一个继承自抽象类Controller的Controller类型,这样的Controller只能定义同步Action方法.如果我们需要定义异步Action方法,必须继承抽象类AsyncController.这篇问你讲述两种不同的异步Action的定义方法和底层执行原理.[本文已经

Java 同步与异步-阻塞与非阻塞理解

Java 同步与异步-阻塞与非阻塞理解 Java 中同步与异步,阻塞与非阻塞都是用来形容交互方式,区别在于它们描述的是交互的两个不同层面. 同步与异步 同步与异步更关注交互双方是否可以同时工作.以同步的方式完成任务意味着多个任务的完成次序是串行的,假设任务 A 依赖于任务 B,那么任务 A 必须等到任务 B 完成之后才能继续,执行流程为 A->B:以异步的方式完成任务意味着多个任务的完成可以是并行的,这种情况多适用于任务之间没有因果关系,假如任务 A 中需要执行任务 B,而任务 A 的完成不依赖

redux的理解。

总是听到有人说redux流程抽象,难度很高,看完官方文档表示,这就是一个典型用于快速开发的框架.理解:store是类似于数据库的东西,负责储存数据.action描述要对store做的事情是什么.reducer表示如何根据action的信息要怎么做的函数,dispatch执行它们.presentational component 是需要用prop的底层函数.而container component 订阅store ,并且根据store的状态生成state的现状,生成需要的dispatch的函数(比

Redux初学理解

Redux是什么? 一个状态(State)管理器,集中管理应用中所有组件的状态.所有组件的状态保存在一个对象里. Redux主要用途? 1)简化组件依赖关系,使可以共享或改变所有组件的状态.2)状态的改变,会引起视图的改变,所以如果想改变视图(View),不管涉及谁的改变,统一找Redux就行了,因为状态都在他那里集中管理.3)Redux 规定, 一个 State 对应一个 View.只要 State 相同,View 就相同.你知道 State,就知道 View 是什么样,反之亦然. 如何使用?