generator函数及其异步的应用
以前windows的线程切换是非抢夺式的,也就是说我要让进程主动让出执行权,如果有一个进程中一个操作卡死,那么会一直等待结果,于是乎不会让出操作权.
在windows95开始就是抢夺式,也就是现在的方式,通过切换时间片,
多核cpu
协程
协程是一种基于线程之上,但又比线程更加轻量级的存在,这种由程序员自己来管理的轻量级线程叫做【用户空间线程】,具体对内核来说不可见的特性。
如果被内核知道会被注册成线程,就会变回抢夺式,因为不可见,所以他切换是千变万化,但是协程的执行权切换,只会用户明确了放弃执行权
正如一个进程可以拥有多个线程,那么多个线程也有多个协程
什么是generator
Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同。本章详细介绍 Generator 函数的语法和 API
Generator 函数的语法
具体查看ES6文档
协程的generator函数实现
function*gen(x){
var y = yeild x + 2;
//yeild 是generator中的一个方法
// yeild 区分指针区域的地方,分阶段用的
return y;
}
var g = gen(1);
//这里是内部指针赋值给g;
g.next()//{value:3,done:false}
//这里表示我们的指针指到第一个位置,然后返回值得到3,没有结束,所以false
g.next()//{value:undefined,done:ture}
//因为上面那一部分没有传值,所以是不存在。
因为第一个next是第一次操作,他没有上一步,所以说不用传参,如果说下一步,就要传参,他会是上一个阶段的返回值,在到这一步中
该函数是一个完整的闭环,可以进行数据交换
错误交换
function *gen(x){
try{
var y = yeild x + 2;
}catch(e){
console.log(e)
}
}
var g = gen(1);
g.next();
g.throw('error');
可以让报错和错误位置分开,
异步任务的封装
var fetch = require('node-fetch');
function*gen(){
var url = 'https://api.github.com/users/github';
var result = yield fetch(url);
//这里看是不是想同步代码
console.log(esult.bio);
}
执行
var g = gen();
//获取指针
var result = g.next();
//指针改到第一个位置,然后执行异步操作
result.value.then(function(data){
// 找到value,调用了then的方法,就相当于我成功了之后调用了这个回调;
return data.json();
}).then(function(data){
//再获取数据,然后返回到gen()函数里
g.next(data)
});