ES6 generator 与 koa 中间件 是如何 generator解决异步的
2017-08-10 22:43
561 查看
标签(空格分隔): JS 同步编程异步执行 异步 同步
参考文章:
koa如何利用generator解决回调:http://blog.stevensanderson.com/2013/12/21/experiments-with-koa-and-javascript-generators/
上述例子并不太像一般的函数封装,看下面这个例子
低版本 koa 不支持 promise 时,可以 thunk 形式来让 koa 识别
参考文章:
koa如何利用generator解决回调:http://blog.stevensanderson.com/2013/12/21/experiments-with-koa-and-javascript-generators/
常规的 generator 概览
// 自己编写的 demo function print(data){ console.log('传入的参数是:',data) } function *g(fn){ for(var i=0;i<10;i++){ yield i yield fn(i) } } var gg = g(print) // 此处有 generator,暂停变成同步执行 gg.next() // 此处是同步阻塞的 {value:'0',done:false} // 当 gg.next() 返回 {value:undefined,done:true} 时, generator 函数才执行完并退出,之后再次变成异步模式 console.log('此处会第一步执行吗?')
上述例子并不太像一般的函数封装,看下面这个例子
function *request(url,fn){ yield fn(url) // 简略不写数据请求了; } function *g(){ var result = [] for(var i=0;i<5;i++){ var r_result = yield request(url) result.push(r_result) // 保证了传入的顺序是对的 } return result // 最后返回了一个结果 }
koa 是如何 generator 的呢?
var koa = require('koa'), app = koa(); app.use(function *() { // Here is the important bit of application logic for this example. // We make use of a series of async operations without callbacks. var city = yield geolocation.getCityAsync(this.req.ip); var forecast = yield weather.getForecastAsync(city); // 此处的参数需要同步传进来 this.body = 'Today, ' + city + ' will be ' + forecast.temperature + ' degrees.'; }); app.listen(8080); //根据上面代码,个人目前猜想实现 use 过程是: function koa(){ var use = function *(fn){ whild(fn().next().done != true){ fn().next() } } return { use, } } //猜想: koa 内部会一直调用 generator,直到 done为 true 时才会退出
低版本 koa 不支持 promise 时,可以 thunk 形式来让 koa 识别
thunk == promise 相同的功能
// Wrap the async operation in a 'thunk' so that Koa understands it function getSquareValueThunk(num) { // A 'thunk' returns a function that accepts a callback return function(callback) { getSquareValueAsync(num, callback); }; } app.use(function *() { var square = yield getSquareValueThunk(16); this.body = "Square of 16 is " + square; });
相关文章推荐
- ES6-深入理解Generator yield & Koa中间件执行顺序
- ES6中Generator与异步操作实例分析
- ajax是什么? ajax的交互模型? 同步和异步的区别? 如何解决跨域问题?
- es6 Generator与异步的同步书写
- 用 ES6 generator & Promise 写异步代码
- 如何解决ES6基础语法不支持的问题。
- ES6 异步编程之一:Generator
- 如何解决JS或Jquery ajax异步跨域问题
- 如何解决设置Session保存在StateServer后引起WebService/WebMethod无法异步获取Session
- [异步][事务][流程][设计]同步当场处理并返回处理结果,异步后如何返回. 如何解决?
- 如何快速解决JS或Jquery ajax异步跨域的问题
- ajax是什么? ajax的交互模型? 同步和异步的区别? 如何解决跨域问题?
- 如何快速解决JS或Jquery ajax异步跨域的问题
- Ajax 是什么?Ajax 的交互模型?同步和异步的区别?如何解决跨域问题?以及 HTTP状态码
- 5、ES6 === 异步 Promise Generator yield
- 异步上传文件-跨域问题如何解决
- jquery的ajax异步请求上传完图片之后会有页面跳转和刷新如何解决?
- ES6 Promise对象解决异步回调
- iphone线程中使用异步网络的问题,以及如何用NSRunLoop来解决
- Ajax 的概念及过程?Ajax 的交互模型?同步和异步的区别?如何解决跨域问题?