Generator 函數(shù)是一種異步編程的解決方案,使異步編程看起來(lái)更像同步
Generator 函數(shù)形式:function* fun() + yield 表達(dá)式。
結(jié)合Co模塊使用的Generator函數(shù),yield表達(dá)式后面只能跟:function, promise, generator, array, or object
const co = require('co');
const readFile = require('fs-readfile-promise');
const fs = require('fs');
/**
* 1、普通 Generator模式
*/
function *a() {
let pb = yield {name : 'zhangsan'}; //Generator函數(shù)執(zhí)行到這里就停下了,不會(huì)再往下執(zhí)行。
console.log('我在Generator函數(shù)內(nèi)---%j',pb); //這里是取不到pb的。這類似于nodejs 的普通異步函數(shù)。
//throw new Error('報(bào)錯(cuò)啦');
}
const b = a();
console.log('b--%j',b); //b--{}
const c = b.next();
console.log('c--%j',c); //c--{"value":{"name":"zhangsan"},"done":false}
const d = b.next();
console.log('d--%j',d); //打印1、我在Generator函數(shù)內(nèi)---undefined 打印2、d--{"done":true}
/**
* 如果我們把第一個(gè)next()中 yield后的值傳遞給 第二個(gè)next(),那么我們就可以拿到pb了。
* 當(dāng)然這種操作我們可以通過(guò) Co模塊來(lái)幫我們實(shí)現(xiàn)。
*/
//const d = b.next(c.value);
//console.log('d-----%j',d); // 打印1、我在Generator函數(shù)內(nèi)---{"name":"zhangsan"} 打印2、d-----{"done":true}
/**
* 2、結(jié)合:Co 模塊
* 注意:結(jié)合Co模塊使用的時(shí)候:yield 后面只能跟:function, promise, generator, array, or object
*/
/**
* 非Promise---偽同步模式
*/
/*function *a() {
try{
let pb = yield {name : 'zhangsan'};
//let pb = yield 1; //這樣是會(huì)報(bào)錯(cuò)的
console.log(pb);
throw new Error('報(bào)錯(cuò)啦');
}catch (e){
console.log(e);
}
}
co(a);*/
/**
* Promise 模式:
* 因?yàn)閏o包裝Generator函數(shù),并返回一個(gè)Promise對(duì)象,所以可以使用 傳統(tǒng)Promise方式來(lái)處理
* @returns {*}
*/
/*function *a() {
let pb = yield {name : 'zhangsan'};
throw new Error('報(bào)錯(cuò)啦');
//return pb;
}
co(a).then(function (data) {
console.log('收到參數(shù):',data);
}).catch(function (err) {
console.log(err);
});*/
#### 示例:異步讀取文件
/**
* 異步讀取文件內(nèi)容
*/
function *getFileContent() {
try{
// let pb = yield readFile('./doc.txt'); //使用第三方的 fs-readfile-promise 包
let pb = yield readFiles(); //使用手動(dòng)包裝成Promise的fs
console.log(pb.toString());
}catch (e){
console.log(e);
}
}
co(getFileContent);
/**
* 一個(gè)返回Promise的函數(shù)
* @returns {Promise}
*/
function readFiles() {
return new Promise(function (reso,rej) {
fs.readFile('./doc.txt',function (err,data) {
reso(data);
})
});
}