当前位置: 首页 > news >正文

郑州网站建设搜索优化网站友情链接检测

郑州网站建设搜索优化,网站友情链接检测,相册网站建设目的,设计一个营销方案原文地址 前言 笔者最近在做一些后台项目,使用的是Ant Design Pro,其使用了redux-saga处理异步数据流,本文将对redux-saga的原理做一个简单的解读,并将实现一个简易版的redux-saga。 Generator函数的自动流程控制 在redux-sag…

原文地址

前言

笔者最近在做一些后台项目,使用的是Ant Design Pro,其使用了redux-saga处理异步数据流,本文将对redux-saga的原理做一个简单的解读,并将实现一个简易版的redux-saga。

Generator函数的自动流程控制

在redux-saga中,saga是指一些长时操作,用generator函数表示。generator函数的强大之处在于其可以手动的暂停、恢复执行,且可以与函数体外进行数据交互,看如下例子:

function *gen() {const a = yield 'hello';console.log(a);
}cont g = gen();
g.next(); // { value: 'hello', done: false }
setTimeout(() => g.next('hi'), 1000)  // 此时 a => 'hi'   一秒后打印‘hi'
复制代码

可以看出来genrator函数何时进行下一步操作完全取决于外部的调度时机,且其内部执行状态也由外部的输入决定,这使得generator函数可以很方便的做异步流程控制。举个例子,我们首先读取一个文件的内容作为查询参数,然后请求一个查询接口并把返回的内容打印出来:

function getParams(file) {return new Promise(resolve => {fs.readFile(file, (err, data) => {resolve(data)})})
}function getContent(params) {//  request返回promisereturn request(params)
}function *gen() {const params = yield getParams('config.json');const content = yield getContent(params);console.log(content);
}
复制代码

我们可以手动控制gen函数的执行:

const g = gen();
g.next().value.then(params => {g.next(params).value.then(content => {g.next(content);})
})
复制代码

以上可以达到我们的目的,但是过于繁琐,我们想要的是generator函数可以自动的执行,可以写一个简易的自动执行函数如下:

function genRun(gen) {const g = gen();next();function next(err, pre) {let temp;(err === null) && (temp = g.next(pre));(err !== null) && (temp = g.throw(pre));if(!temp.done) {nextWithYieldType(temp.value, next);}}
}function nextWithYieldType(value, next) {if(isPromise(value)) {value.then(success => next(null, success)).catch(error => next(error))} 
}genRun(gen);
复制代码

此时generator函数便可以自动执行,事实上我们可以发现,generator的内部状态完全是由nextWithYieldType决定的,我们可以根据yield的类型执行不同的处理逻辑。

Effect

事实上sagaMiddleware.run(saga)可以类似看做genRun(saga),而saga是由一个个的effect组成的,那么effect是什么?redux-saga官网的解释:一个 effect 就是一个 Plain Object JavaScript 对象,包含一些将被 saga middleware 执行的指令。redux-saga提供了很多Effect创建器,如callputtake等,已call为例:

function saga*() {const result = yield call(genPromise);console.log(result);
}
复制代码

call(genPromise)生成的就是一个effect,它可能类似如下:

{isEffect: true,type: 'CALL',fn: genPromise
}
复制代码

事实上effect只表明了意图,而实际的行为由类似于上文的nextWithYieldType完成,例如:

function nextWithYieldType(value, next) {...if(isCallEffect(value)) {value.fn(). then(success => next(null, success)).catch(error => next(error))  } 
}
复制代码

当genPromise函数返回的promise被resolve后便会打印出结果。

生产者与消费者

观察下面的例子

function *saga() {yield take('TEST');console.log('test...');
}sagaMiddleware.run(test);
复制代码

saga会在take('TEST')处阻塞,只有执行了dispatch({type: 'TEST'})后saga才能继续运行(注意:此时的dispatch方法是经过sagaMiddleware包装过的)。这给我们的感觉似乎很像是take是一个生产者,在等待disaptch的消费,事实上take只是一个Effect生成器,具体的处理逻辑依然是在nextWithYieldType完成的,类似于:

function nextWithYieldType(value, next) {...// take('TEST')生成的effect简单的认为是  {isEffect: true, type: 'TAKE', name: 'TEST'}if(isTakeEffect(value)) {channel.take({pattern: value.name, cb: params => next(null, params)})  } 
}
复制代码

channel是一个任务生成器,它有两个方法:take生成任务,put消费任务:

function channel() {/*task = {pattern,cb}*/let _task = null;function take(task) {_task = task;}function put(pattern, args) {if(!_task) return;if(pattern == _task.pattern) _task.cb.call(null, args);}return {take,put}
}
复制代码

显然任务是在执行dispatch的时候被消费掉的,这个工作是在sagaMiddleware中做的,类似于如下:

const sagaMiddleware = store => {return next => action => {next(action);const { type, ...payload } = action;channel.put(type, payload);}
} 
复制代码

看到这里我们可以发现,需要我们做的就是不断的完善nextWithYieldType这个函数,当完成了putforktakeEvery对应的逻辑后,一个具备基本功能的redux-saga就诞生啦,笔者就不在赘述这些功能的实现了。最后,你可以查看这里:tiny-redux-saga,这是笔者实现的一个简易版的redux-saga,希望对你有所帮助。


全文完。


作者:菜菜_张
链接:https://juejin.im/post/5c021f245188252bf829ce26
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

http://www.lbrq.cn/news/2377603.html

相关文章:

  • 绥化建设局网站自己的网站怎么推广
  • 电商网站的在线客服怎么做杭州优化公司哪家好
  • 电影网站cpa怎么做网站推广seo方法
  • 短网址还原工具seo服务指什么意思
  • 时时彩网站做号五个常用的搜索引擎
  • 怎样做网站备份搜狗网站收录入口
  • 建网站的程序营销推广与策划
  • 深圳商城网站哪家做的好快速排名工具免费
  • 深圳政府采购中心官网四川整站优化关键词排名
  • 学做衣服上什么网站好推广下载app赚钱
  • 网推团队淘宝seo推广优化
  • 做网站设计所遇到的问题seo推广软件费用
  • 物流网站建设可行性报告营销培训讲师
  • 在中国怎么做国外网站百度云客服人工电话
  • 邢台市网站制作推广游戏怎么拉人最快
  • 海尔建设此网站的目的是什么意思百度业务推广
  • 松江做网站需要多少钱服装品牌策划方案
  • 安居客看房网北京seo编辑
  • 公司网站成本域名污染查询网站
  • 网站建设学院谷歌seo实战教程
  • 公司起名字查询网南京seo优化公司
  • 网站内套网站代码网络推广与网络营销的区别
  • 西乡做网站多少钱推广链接点击器app
  • 昆明做网站建设的公司哪家好裤子seo标题优化关键词
  • 预售网站开发郑州网站策划
  • 手机网站开发兼容性怎么注册自己的网址
  • 如何做网站支付链接武汉做seo公司
  • vue做的网站有什么百度加盟
  • 小叮当网站建设网络搭建教程
  • 网页制作下载安装包无锡seo公司哪家好
  • 服务端高并发方案设计
  • AWS(基础)
  • HTML表格基础
  • Java学习--JVM(2)
  • 能行为监测算法:低成本下的高效管理
  • rocky8 --Elasticsearch+Logstash+Filebeat+Kibana部署【7.1.1版本】