使用promise 和 generator来管理工作流
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);
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来管理工作流的更多相关文章
- ES6中的Promise和Generator详解
目录 简介 Promise 什么是Promise Promise的特点 Promise的优点 Promise的缺点 Promise的用法 Promise的执行顺序 Promise.prototype. ...
- 前端面试送命题(二)-callback,promise,generator,async-await
前言 本篇文章适合前端架构师,或者进阶的前端开发人员:我在面试vmware前端架构师的时候,被问到关于callback,promise,generator,async-await的问题. 首先我们回顾 ...
- JS异步编程 (2) - Promise、Generator、async/await
JS异步编程 (2) - Promise.Generator.async/await 上篇文章我们讲了下JS异步编程的相关知识,比如什么是异步,为什么要使用异步编程以及在浏览器中JS如何实现异步的.最 ...
- 【原创】分布式之数据库和缓存双写一致性方案解析(三) 前端面试送命题(二)-callback,promise,generator,async-await JS的进阶技巧 前端面试送命题(一)-JS三座大山 Nodejs的运行原理-科普篇 优化设计提高sql类数据库的性能 简单理解token机制
[原创]分布式之数据库和缓存双写一致性方案解析(三) 正文 博主本来觉得,<分布式之数据库和缓存双写一致性方案解析>,一文已经十分清晰.然而这一两天,有人在微信上私聊我,觉得应该要采用 ...
- 原生JS中 callback,promise,generator,async-await 的简介
callback,promise,generator,async-await 的简介 javascript异步的发展历程. ES6 以前: 回调函数(callback):nodejs express ...
- ES Next & Arrow function & Promise & Iterator & Generator yield & Async Await
ES Next & Arrow function & Promise & Iterator & Generator yield & Async Await co ...
- 前端笔记之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 ...
- Promise和Generator
异同: 1.promise解决的是串行的嵌套异步问题. 2.yield把Generator Function切割为有多个出口的Generation. 3.Promise是社区的研发产物,yield是E ...
- Promise、Generator,Async/await
我们知道JavaScript是单线程语言,如果没有异步编程非得卡死. 以前,异步编程的方法有下面四种 回调函数 事件监听 发布/订阅 Promise对象 现在据说异步编程终极解决方案是——async/ ...
随机推荐
- java.lang.Math
四舍五人 System.out.println(Math.round(1.8f));//输出位2 static(静态)方法random() //: object/Shifting.java packa ...
- 如何将自己的Image镜像Push到Docker Hub
首先需要一个docker官方账号 这里我添加了一个AspNetCore程序 通过创建了一个镜像(前面提过使用Dockerfile处理了) docker build -t dockertest . 首先 ...
- 快速构建ceph可视化监控系统
https://my.oschina.net/colben/blog/1844602 https://my.oschina.net/u/3626804/blog/1859613
- HBuilder支持jquery、zepto、angular、ext、dojo 等js框架的提示吗
HBuilder有通行的js扫描分析提示,大部分js库都可以方便的提示.但js是一门超级灵活的语言,通行分析有时分析的不够完美,如果对框架做单独优化配置,可以有更好的提示.DCloud官方对jquer ...
- bind this指针
var TEST = { msg: 'test', ping: function() { return this.msg }.bind(this /* this -> window */) }
- 转:CentOS下后台运行Python脚本及关闭脚本的一些操作
自己写了一个python脚本,但是直接远程用putty连接后#python xxx.py执行,关闭putty脚本也随之关闭了,这里需要用到‘setsid’这个命令. #setsid python xx ...
- 安装elasticsearch-7.0.0及插件
下载安装包:(下载地址:https://www.elastic.co/cn/downloads/elasticsearch)elasticsearch-7.0.0-linux-x86_64.tar.g ...
- 6-9 天平 uva839
这题十分巧妙!!代码精简!强大的递归!!! 边读边判断 先读到底部 慢慢往上判断 难点在于传递w1+w2 有一个比LRJ更加简便的方法 return传递 全局变量判断 #include ...
- JQuery框架2.位置属性|筛选方法|事件
1.位置属性 jquery的css position获取匹配元素相对父元素的偏移位置:offset获取匹配元素在当前视口的相对偏移,返回的对象包含两个整型属性:top 和 left $("p ...
- 求链表的倒数第m个元素
法一: 首先遍历一遍单链表,求出整个单链表的长度n,然后将倒数第m个,转换为正数第n-m+1个,接下去遍历一次就可以得到结果. 不过这种方法需要对链表进行两次遍历,第一次遍历用于求解单链表的长度,第二 ...