根据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. 【gearman】学习笔记

    学习资料:http://gearman.org/manual/ 1.Gearman是跨语言的,client和worker可以用不同的语言来实现 2.client与job server之间的交互称为ta ...

  2. 方法名太多,使用方法的重载(overload)来解决

    package chapter04; /* 问题:方法名太多了,不容易记忆,有时会出错 使用方法的重载(overload)来解决 */public class C09_Method { public ...

  3. C/S权限系统得到拼音和五笔的自定义函数(二)

    得到五笔: CREATE FUNCTION [dbo].[fun_getWB](@Str VARCHAR(2000)) RETURNS VARCHAR(2000) AS BEGIN DECLARE @ ...

  4. JavaScript实现抽象类与虚方法(六)

    一:什么是js抽象类与虚方法 虚函数是类成员中的概念,是只做了一个声明而未实现的方法,具有虚函数的类就称之为抽象类,这些虚函数在派生类中才被实现.抽象类是不能实例化的,因为其中的虚函数并不是一个完整的 ...

  5. ajax请求返回json字符串/json对象 处理

    1. 返回json字符串如何处理 $.ajax({ url:xxx, success:function(date){ }, error:function(){ } }); 通过最原始的返回: Prin ...

  6. Storm(三)Storm的原理机制

    一.Storm的数据分发策略 1. Shuffle Grouping 随机分组,随机派发stream里面的tuple,保证每个bolt task接收到的tuple数目大致相同. 轮询,平均分配 2. ...

  7. 鼠标hover元素scale/zoom中心点放大效果实例页面

    CSS代码: .box { /* 可见视觉区域 */ width: 480px; height: 250px; position: relative; overflow: hidden; cursor ...

  8. CSS 1. 选择器

    1.css的介绍 CSS是指层叠样式表(Cascading Style Sheets),样式定义如何显示HTML元素,样式通常又会存在于样式表中.也就是说把HTML元素的样式都统一收集起来写在一个地方 ...

  9. linux学习之使用fdisk命令进行磁盘分区(八)

    linux下使用fdisk命令进行磁盘分区 目录 分区类型 分区方法表示 文件系统 fdisk命令分区过程 分区类型 主分区:总共最多只能分四个 扩展分区:只能有一个,也算作主分区的一种,也就是说主分 ...

  10. 仿win10环境变量助手

    相信很多人用过win10后再换回win7或者xp等系统都会有些不习惯,所以在这里安利一款博主自己开发的小软件:环境变量助手. 继承于Win10风格的环境变量,操作简单方便,使用时需要账户权限. 注意: ...