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的更多相关文章

  1. koa01

    1.koa简介 koa是express团队开发的一个更加轻量级的服务端开发框架,也是未来的趋势 2.安装 npm i -g koa-generator //全局安装koa脚手架 3.创建项目 koa2 ...

随机推荐

  1. centos_7.1.1503_src_4

    http://vault.centos.org/7.1.1503/os/Source/SPackages/ libkcompactdisc-4.10.5-3.el7.src.rpm 05-Jul-20 ...

  2. go语言爬虫goquery和grequests的使用

    /*下载工具*/ package main import ( "fmt" //go语言版本的jquery "github.com/PuerkitoBio/goquery& ...

  3. selenium 点击浏览器按钮

    利用以下的方法,selenium 也可以模拟点击各种浏览器按钮:browser.back()点击“返回”按钮.browser.forward()点击“前进”按钮.browser.refresh()点击 ...

  4. 项目评审ppt的纲要

    1.prd不能模糊,产品的问题全部明确 2.收益在哪里 3.设计体现业务4.怎样保证数据的前后协作5.异常如何处理6.技术解决的痛点7.对外部依赖8.性能指标预期(响应时间)9.

  5. 2.Python3标准库--文本

    (一)string:文本常量和模板 1.函数 import string ''' string模块在最早的Python版本中就已经有了.以前这个模块中提供的很多函数已经移植到str对象中,不过这个模块 ...

  6. jboss和tomcat有什么不同

    2.tomcat 是 JSP/Servlet 容器jboss 是 JEE 容器,JEE 包括JSP/Servlet,JMS, EJB,JAX-WS,JAX-RS,CDI等等, tomcat是完全开源, ...

  7. classpath中怎样一次性加入整个目录的jar文件

    linux可以通过shell来处理 1 2 3 for jar in $HOME/lib/*.jar; do     CLASSPATH=$CLASSPATH:$jar done          

  8. Table上下滚动

    <table> <tr> <td> <div id="marquees"> <!-- 这些是字幕的内容,你可以任意定义 --& ...

  9. centos7 samba安装

    http://www.cnblogs.com/muscleape/p/6385583.html 1 安装yum install samba 2 添加用户xxx smbpasswd -a xxx 3 s ...

  10. Codeforces 429 B. Working out-dp( Codeforces Round #245 (Div. 1))

    B. Working out time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...