从co到koa01-co
thunk
- 他的发展是由函数的求值策略的分歧决定的,两种求值策略
- 传值调用,在进入函数体之前就直接执行完,把值传进去
- 传名调用,将表达式传入函数体,只在用到他的时候求值
- 传名函数的编译器实现,其实就是放入一个临时函数,再将临时函数传入函数体,这个临时函数就叫做thunk函数
- js语言是传值调用,他的thunk含义有些不同,js中,thunk函数替换的不是表达式,而是多参数函数,将它替换成单参数的版本,且只接受回调函数作为参数
- 任何有回调的函数都是可以搞成thunk形式的,下面是一个简单的生成器
var Thunk = function(fn){
return function () {
//先传入其他的参数初始化
var args = Array.prototype.slice.call(arguments);
//传入callback返回的函数
return function(callback){
args.push(callback);
//实际调用的时候
return fn.apply(this,args);
}
}
}
var readFileThunk = Thunk(fs.readFile);
readFileThunk(fileA)(callback);
generator
- Generator是为JavaScript设计的一种轻量级的协程。它通过yield关键字,可以控制一个函数暂停或者继续执行generator函数
function * hello (name) {
yield 'your name is: ' + name
return 'input name is: ' + name
}
const gen = hello('jinks')
//your name is: jinks
gen.next().value
//input name is: jinks
gen.next().value
CO
- co的根本目的:将异步操作跟在yield后面,当异步操作完成并返回结果后,再触发下一次next() 。跟在yield后面的异步操作需要遵循一定的规范thunks和 promises
//简化版co
const fs = require('fs')
const Q = require('Q')
const readdir = Q.denodeify(fs.readdir)
//或者thunk规范
const thunkify = require('thunkify')
const readdir = thunkify(fs.readdir)
function co(generator) {
return function (fn) {
fn = fn || function () {}
const gen = generator()
function next (err, result) {
if(err) {
return fn(err)
}
const step = gen.next(result)
if(!step.done) {
// thunk
step.value(next)
// promise
step.value.then(res => next(null, res)).catch(err => next(err))
} else {
fn(null, step.value)
}
}
next()
}
}
function *test() {
const result = yield readdir(dir)
}
co(test)((err, result) => {
console.log(err, result)
})
从co到koa01-co的更多相关文章
- koa01
1.koa简介 koa是express团队开发的一个更加轻量级的服务端开发框架,也是未来的趋势 2.安装 npm i -g koa-generator //全局安装koa脚手架 3.创建项目 koa2 ...
随机推荐
- Java中volatile修饰符,不稳定标记的用法笔记
今天学java特性时,发现了volatile修饰符,这个修饰符修饰的变量告诉java编译器忽略优化机制,这样的优势是: java优化后,寄存器会缓存内存里的变量,另一个线程修改这个变量的内存时,不会同 ...
- js-xlsx操作excel表格
1导入与导出功能实现 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- 离线安装SDK
1.下载android-sdk_rXX-windows.zip(XX为版本号,也可以下.exe版的不过没试过) 2.下载SDK 2.1.在浏览器输入http://dl-ssl.google.com/a ...
- redis 的优化
1.pipeling “请求-响应”模式的服务器在处理完一个请求后就开始处理下一个请求,不管客户端是否读取到前一个请求的响应结果.这让客户端不需要发一个请求等一个响应的串行,可以一次发送多个请求,再最 ...
- spring使用aop需要的jar包,和常见异常
3.0以后spring不再一起发布aop依赖包,需要自己导入: 必须包: 这几个jar包分别为 1.org.springframework.aop-3.1.1.RELEASE 这个是spring的 ...
- hdu 2448(KM算法+SPFA)
Mining Station on the Sea Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- Python3判断自身脚本是不是在运行
采用Socket方式,启动时占用一个端口,转化问题为判断端口是不是存在? import sys import locale import http.server import socketserver ...
- SnagIt截图后无法在编辑器打开,不显示截图内容的解决办法(转)
方法1: 用SnagIt截图后,弹出的编辑器里不显示刚才截图的内容,解决办法如下: 完全退出Snagit和编辑器,删除以下文件夹: Win7用户 C:\Users\Administrator\AppD ...
- Go语言的web程序写法
一切来自于扩展... 核心也即处理输入输出... // helloworld project main.go package main import ( "fmt" "h ...
- Linux:hping高级主机扫描
https://www.aliyun.com/jiaocheng/167107.html https://blog.csdn.net/weixin_39762926/article/details/7 ...