版本:1.0.6
用于快速创建React Saga项目
npm install -g saga-cli
直接开始:初始化一个纯净的项目(只有核心代码、推荐大神使用)
saga-cli init TestProject
或者
(推荐
) 初始化一个带默认示例的业务项目(saga、router、bundle都集成了)
saga-cli demo TestProject
或者查看帮助
saga-cli --help
Example
随便进入到一个目录:
$ saga-cli init SagaTest
执行完成后:
$ cd SagaTest
$ npm install
启动项目:
$ npm run dev //开发环境
或者:
$ npm run build //用于生产环境代码打包
//webpack
npm install --save-dev webpack
npm install --save-dev webpack-dev-server
//react
npm install --save react react-dom
//router v4版本
npm install --save react-router react-router-dom
//redux
npm install --save redux react-redux redux-saga
//babel
npm install --save-dev babel-core babel-loader babel-preset-react babel-preset-es2015 babel-preset-stage-0 babel-preset-stage-3
project
│ .babelrc
│ .gitignore
│ package.json
│ README.md
│ test.txt
│ webpack.config.js
│
└─src
│ app.jsx # 项目初始化
│ main.jsx # 项目入口
│ template.html # 自动生成页面的模板
│
├─common
│ │ util.js # Redcer工具方法
│ │ wish.js # 自用工具方法:fetch
│ │
│ ├─api
│ │ index.js # action type映射接口url
│ │
│ └─styles
│ app.less
│ theme.less
│
├─layout
│ │ Header.jsx # 布局组件(业务相关)
│ │ RouteLayout.jsx # 根路由配置组件(业务相关)
│ │ SilderLayout.jsx # 侧边栏组件(业务相关)
│ │
│ └─styles
│ layout.less
│
├─router # 由于这里按路由划分模块、所以使用router命名
│ │ reducer.js # 模块公用的reducer
│ │
│ ├─about
│ │ index.jsx # about业务模块组件、没有实际业务
│ │
│ └─home
│ │ actions.jsx # home模块的actions配置
│ │ index.jsx # home模块的主业务容器组件
│ │ reducer.js # home模块的reducer定义
│ │
│ ├─components # home模块的所用到的组件
│ │ ArticleCollect.jsx
│ │ ArticleEdit.jsx
│ │ ArticleList.jsx
│ │
│ └─styles
│ index.less
│
└─saga
core.js # saga核心包
部分代码说明
/**
* 我封装的常用工具方法
* 1 axios封装的fetch
*/
import wish from 'src/common/wish';
/**
* 我封装的SagaCore模块
* 1 创建Store
* 2 创建Saga
* 3 内置默认reducer信息
*/
import SagaCore from 'src/saga/core';
/**
* 接口url和action type的映射关系模块
*/
import urls from 'src/common/api/index';
/**
* 所有模块的reducer
*/
import AppReducer from 'src/router/reducer';
import HomeReducer from 'src/router/home/reducer';
const reducer={
app:AppReducer,
home:HomeReducer
}
wish.bindUrls(urls);
wish.create();
//通过SagaCore模块直接生成Store
var Store=SagaCore.init(reducer,function(action={data:{}}){
return wish.fetch({name:action.type,...action.data},action.method).then((res)=>res);
})
在main.jsx中直接引入,如:
import AppReducer from 'src/router/reducer';
import HomeReducer from 'src/router/home/reducer';
+import UserReducer from '...'
const reducer={
app:AppReducer,
home:HomeReducer,
+ user:UserReducer
}
/**
* 加载模块的根业务组件
*/
import HomeContainer from 'bundle-loader?lazy!src/router/home/index';
import AboutContainer from 'bundle-loader?lazy!src/router/about/index';
/**
* Bundle加载业务组件
* @Author WangBing
* @DateTime 2017-11-24
* @param {[type]} props [description]
* @returns {[type]} [description]
*/
const RouterHome=(props)=>{
return
{(Container) => }
}
const RouterAbout=(props)=>{
return
{(Container) => }
}
/**
* 按照正常路由配置、配置组件
* @Author WangBing
* @DateTime 2017-11-24
* @returns {[type]} [description]
*/
export default () => {
return
}
前言 在使用react redux的时候,会经常遇到需要处理异步action的情况。处理异步action的方法有几种。其中redux-thunk,redux-saga都是处理异步action的中间件。利用这些中间件可以很好的达到我们预期效果 redux-saga redux-saga是一个用于管理应用程序 Side Effect(副作用,例如异步获取数据,访问浏览器缓存等)的 library,它的
seata saga模式 整理自seata 官网 seata.io 为什么要用saga模式 场景,调用第三方系统,且不能提供TCC接口,否则还是建议使用TCC 优点 1、适用场景 2、如果一个过程已经完善了,后续可以复用 缺点 1、侵入性强 2、要新增状态的时候或者在整个事务中增加一个流程(状态),需要修改json Saga 服务设计的实践经验 允许空补偿 空补偿:原服务未执行,补偿服务执行了 出
redux-saga是管理redux异步操作的中间件,redux-saga通过创建sagas将所有异步操作逻辑 收集在一个地方集中处理。 sagas采用Generator函数来yield Effects。Generator函数可以暂停执行,再次执行的时候 从上次暂停的地方继续执行。常见的effect有:fork,call,take,put,cancel 由于使用了generator函数,redux
安装: npm install -g ganache-cli@6.1.8 使用: userdeMacBook-Pro:~ user$ ganache-cli -m "success rifle romance major host prosper subway regular edge old lake achieve" 这样就能够使用图形化界面的ganache中的账户设置了 返回: Ganach
Redux-saga 简介 使用量较高的一种redux形式 使用阿里系的脚手架工具 1.dva 2.umi Saga与Thunk的区别 redux-saga使用率更高 redux-thunk 将异步数据请求的任何和非异步的任务都放在一起了, 乱锅炖 redux-sage 只处理异步任务 非异步任务还是放给组件做比较合适 redux-saga会将异步任务放入到一个 任务池 Dva 数据流 — red
saga使用后体验 优点一,分离了action和effect,变得更纯粹 感觉这不是他的核心重点,因为即使分离了,也没法复用 action为异步请求,在saga中只不过是,将thunk的异步请求分离到了saga中 然后再put(action)等价于thunk 中的dispatch 真正优点 takeLatest处理重复点击的问题,一定业务条件下不用写debounce takeLatest,在上个
如何使用saga: 1.使用createSagaMiddleware方法创建saga 的Middleware const sagaMiddleware = createSagaMiddleware() 2.在创建的redux的store时,使用applyMiddleware函数将创建的saga Middleware实例绑定到store上. applyMiddleware(sagaMiddlewar
管理复杂的业务事务 并不是每个命令都能够在单个ACID事务中完全执行。银行转帐是一个很常见的例子,常常作为他们的论据。人们经常认为,将资金从一个账户转移到另一个账户的交易绝对需要原子性和一致性。其实呢,不是的这样的。相反,这是不可能的。如果钱从A银行的账户转移到B银行的另一个账户? A银行是否须要锁定B银行数据库?如果转账正在进行中,银行A已经扣除了这笔款项,但银行B还没有存入该钱,这有点奇怪?事
Saga相关(长时间存活事务LLT) Saga模型是什么 它是由多个有序的事务组成、并且与其他事务可以交错的一个长时间事务(LLT:long lived transaction?) 现状 一个长时间事务会在相对较长的时间内占用数据库资源,明显的阻碍了较短的和公用的其他事务完成。 白话文:长时间事务引发的问题 Saga解决了什么 saga讲述的是如何处理long lived transaction(
新东西。中午刷微服务的时候看到的。 saga:你翻译的话会给你说一些意思,但是跟今天的主题完全不一样的。不信你自己去百度(皮一下真的很开心耶)。 主题是:微服务 不知道你有没有跟我一样的困惑,现在都在流行微服务,但是跨服务之前的数据库事务变得复杂起来。我在前东家入了go,接触了微服务,不同服务之间的数据库事务很难搞定(技术比较菜)。网上说了一大堆的CAP理论(反正我是看得云里雾里)。 进入主题 s
SAGA GIS是一款功能强大的开源GIS软件。因近期用到里面的模块去获取水文指数,所以需要深入的了解一下它。SAGA它支持ws os还有linux系统,而且可以用它的GUI软件,或是使用python api,可谓功能强大。但是,面对处理大数据量时,GUI软件运行的往往不是很问题,所以想起试试api。 在使用过程中,提供了软件安装包,点击saga.exe直接运行即可,相当于installer版本。
SAGA是一个免费的地理信息系统(GIS),与一个特殊的应用程序编程接口(API的)地理数据处理。这个API可以很容易实施的新算法。它的API支持网格数据,矢量数据,并表。 功能和特点 ◆ SAGA是系统自动地学分析的缩写 ◆ 是一个地理信息系统(GIS)软件 ◆ 已设计为一个容易和有效地执行空间算法 ◆ 提供了一个全面的,越来越多的地球科学方法 ◆ 提供了一个容易平易近人的用户界面与许多可视化的
我不知道如何恰当地问这个问题,但它是这样的: 我在特定事件上开始了传奇,然后我调度命令,该命令应该创建一些聚合,然后发送另一个事件,该事件将由传奇处理,以继续逻辑。 但是,每次我重新启动应用程序时,我都会得到一个错误,说序列x处的聚合事件已经插入,我想这是因为这个传奇还没有完成,当我重新启动它时,它会通过尝试创建新的聚合来再次启动它。 谢谢
概述 Saga模式是SEATA提供的长事务解决方案,在Saga模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务开发实现。 理论基础:Hector & Kenneth 发表论⽂ Sagas (1987) 适用场景: 业务流程长、业务流程多 参与者包含其它公司或遗留系统服务,无法提供 TCC 模式要求的三个接口 优势:
This project was bootstrapped with Create React App. This is an advanced Boilerplate Project using: Redux Axios Reselect Immutable Recompose Redux-Saga React-Router React-Router-Redux Getting Started
我已经写了一个事件源聚合,现在实现了一个事件源佐贺。。。我注意到这两者是相似的,并创建了一个事件源对象作为基类,它们都是从中派生的。 我在这里看过一个演示http://blog.jonathanoliver.com/cqrs-sagas-with-event-sourcing-part-ii-of-ii/但是觉得可能有一个问题,因为在进程崩溃的情况下,命令可能会丢失,因为命令的发送在写事务之外?
我需要从消费者内部访问saga存储库,以读取与正在消费的消息相关的saga的当前状态。 场景:我有一个外部服务,当这个服务使用来自传奇的事件时,我想看看传奇是否仍然处于正确的状态,因为如果同时传奇改变了状态,消费者必须跳过事件。 如何:我当然可以通过使用它的本机框架来查询选择的saga存储库实现,但是我想使用一个抽象,一个接口,从消费者内部加载saga状态,以便将来能够切换到不同的存储库实现。 感