根据p219的代码改编
示例代码如下
function oneStep(value){
return new Promise(function(resolve, reject){
resolve('one step,' + value);
})
} let stepGenerator = function* (){
try{
for(let i =0; i < 10; ++i){
let value = yield oneStep(`step${i}`);
console.log(`step${i} complete, value:${value}`);
}
}catch(e){
console.log('generator e', e);
}
} function run(generator){
let it = generator(); function go(result){
console.log('go,', result);
if(result.done){
console.log('done');
return result.value;
} return result.value.then(function(value){
console.log('call go again, then');
return go(it.next(value));
}).catch(function (error){
console.log('call go again, catch');
return go(it.throw(error))
});
}
console.log('call go first');
return go(it.next());
} let value = run(stepGenerator);
console.log('value', value);
oneStep代表一个执行步骤,是异步执行的。
stepGenerator代表一个流程,内部包含了一系列的步骤
然后在run函数通过递归的方式执行一个流程,上一步执行完了就执行下一步。
 
输出结果如下
call go first
go, { value: Promise { 'one step,step0' }, done: false }
value Promise { <pending> }
call go again, then
step0 complete, value:one step,step0
go, { value: Promise { 'one step,step1' }, done: false }
call go again, then
step1 complete, value:one step,step1
go, { value: Promise { 'one step,step2' }, done: false }
call go again, then
step2 complete, value:one step,step2
go, { value: Promise { 'one step,step3' }, done: false }
call go again, then
step3 complete, value:one step,step3
go, { value: Promise { 'one step,step4' }, done: false }
call go again, then
step4 complete, value:one step,step4
go, { value: Promise { 'one step,step5' }, done: false }
call go again, then
step5 complete, value:one step,step5
go, { value: Promise { 'one step,step6' }, done: false }
call go again, then
step6 complete, value:one step,step6
go, { value: Promise { 'one step,step7' }, done: false }
call go again, then
step7 complete, value:one step,step7
go, { value: Promise { 'one step,step8' }, done: false }
call go again, then
step8 complete, value:one step,step8
go, { value: Promise { 'one step,step9' }, done: false }
call go again, then
step9 complete, value:one step,step9
go, { value: undefined, done: true }
done
 
 

使用promise 和 generator来管理工作流的更多相关文章

  1. ES6中的Promise和Generator详解

    目录 简介 Promise 什么是Promise Promise的特点 Promise的优点 Promise的缺点 Promise的用法 Promise的执行顺序 Promise.prototype. ...

  2. 前端面试送命题(二)-callback,promise,generator,async-await

    前言 本篇文章适合前端架构师,或者进阶的前端开发人员:我在面试vmware前端架构师的时候,被问到关于callback,promise,generator,async-await的问题. 首先我们回顾 ...

  3. JS异步编程 (2) - Promise、Generator、async/await

    JS异步编程 (2) - Promise.Generator.async/await 上篇文章我们讲了下JS异步编程的相关知识,比如什么是异步,为什么要使用异步编程以及在浏览器中JS如何实现异步的.最 ...

  4. 【原创】分布式之数据库和缓存双写一致性方案解析(三) 前端面试送命题(二)-callback,promise,generator,async-await JS的进阶技巧 前端面试送命题(一)-JS三座大山 Nodejs的运行原理-科普篇 优化设计提高sql类数据库的性能 简单理解token机制

    [原创]分布式之数据库和缓存双写一致性方案解析(三)   正文 博主本来觉得,<分布式之数据库和缓存双写一致性方案解析>,一文已经十分清晰.然而这一两天,有人在微信上私聊我,觉得应该要采用 ...

  5. 原生JS中 callback,promise,generator,async-await 的简介

    callback,promise,generator,async-await 的简介 javascript异步的发展历程. ES6 以前: 回调函数(callback):nodejs express ...

  6. ES Next & Arrow function & Promise & Iterator & Generator yield & Async Await

    ES Next & Arrow function & Promise & Iterator & Generator yield & Async Await co ...

  7. 前端笔记之ES678&Webpack&Babel(下)AMD|CMD规范&模块&webpack&Promise对象&Generator函数

    一.AMD和CMD规范(了解) 1.1传统的前端开发多个js文件的关系 yuan.js中定义了一个函数 function mianji(r){ return 3.14 * r * r } main.j ...

  8. Promise和Generator

    异同: 1.promise解决的是串行的嵌套异步问题. 2.yield把Generator Function切割为有多个出口的Generation. 3.Promise是社区的研发产物,yield是E ...

  9. Promise、Generator,Async/await

    我们知道JavaScript是单线程语言,如果没有异步编程非得卡死. 以前,异步编程的方法有下面四种 回调函数 事件监听 发布/订阅 Promise对象 现在据说异步编程终极解决方案是——async/ ...

随机推荐

  1. 前端开发必须知道的JS(一) 原型和继承

    原型和闭包是Js语言的难点,此文主要讲原型及原型实现的继承,在(二)中会讲下闭包,希望对大家有所帮助.若有疑问或不正之处,欢迎提出指正和讨论. 一. 原型与构造函数 Js所有的函数都有一个protot ...

  2. 采用busybox 代替android 自带的shell

    折腾了几天,被Android那点儿少得可怜的shell命令折磨的死去活来,终于下定了革命的决心.看一下怎么把渺小的toolbox替换成伟大的busybox吧.先大致描述一下Android系统中的she ...

  3. VIM 键盘符号

    :h key-notation //查询键盘符号说明<>> 等于shift + > % 是跳到对应的括号 x 是删除当前字符,即右括号 '' 是跳回左括号 x 删除左括号

  4. MySQL索引底层实现原理

    优秀博文: MySQL索引背后的数据结构及算法原理 B树.B-树.B+树.B*树[转],mysql索引 MySQL 和 B 树的那些事 索引的本质 MySQL官方对索引的定义为:索引(Index)是帮 ...

  5. Python 定值类

    1.__str__和__repr__ 如果要把一个类的实例变成 str,就需要实现特殊方法__str__(): class Person(object): def __init__(self, nam ...

  6. intellij idea svn 修改文件后,父文件夹也标注修改

    svn文件修改后,默认只有当前文件更改而父文件没有标注,很不直观:查了一顿后,发现,可以设置: File—->settings—->version control—–>勾选show ...

  7. java使用md5加密

    代码: public String EncoderByMd5(String str) throws NoSuchAlgorithmException, UnsupportedEncodingExcep ...

  8. ubuntu ufw防火墙软件的配置入门

    顺便,一条龙作完安全吧. ufw的使用,是比iptables简单.但只能作简单的事儿,更改简单的netfilter里的iptable里的记录.难点的,可能还是得iptables原生命令. 自打2.4版 ...

  9. HDU5730

    cdq分治+FFT 转移:dp[i]=Σdp[i-j]*a[j](1<=j<=i)

  10. linux下安装openoffice

    一.环境 centos6.9 安装jdk1.6及以上 二.安装依赖 yum install libXext.x86_64 -y yum install freetype -y yum groupins ...