1、Promise
const fs = require('fs');
//nodejs的内置模块,由于读取文件一般是由异步执行,这样不会阻塞别的功能代码执行
//把fs封装成一个Promise对象,然后在下面返回数据输出
const read = function(fileName) {
return new Promise((resolve ,reject ) => {
fs.readFile(fileName , (err,data) => {//异步。readFileSync(同步,阻塞下面代码执行)
if (err) {
reject(err);
} else {
resolve(data);
}
})
});
}
read("1.txt").then( res => {
console.log(res.toString());
return read("2.txt");
})
.then( res => {
console.log(res.toString());
})
console.log('end')
end
我是第一个文本。
我是第二个文本。
注:由于promise异步函数,所以当执行时end会比文本内容优先输出。
2、Generator函数
const fs = require('fs');
//nodejs的内置模块,由于读取文件一般是由异步执行,这样不会阻塞别的功能代码执行
//把fs封装成一个Promise对象,然后在下面返回数据输出
const read = function(fileName) {
return new Promise((resolve ,reject ) => {
fs.readFile(fileName , (err,data) => {//异步。readFileSync(同步,阻塞下面代码执行)
if (err) {
reject(err);
} else {
resolve(data);
}
})
});
}
function * show(){
yield read("1.txt");
yield read("2.txt");
yield read("3.txt");
}
const s = show();
s.next().value
.then( res => {
console.log('1 ' + res.toString());
return s.next().value;
})
.then( res => {
console.log('2 ' + res.toString());
return s.next().value;
})
.then( res => {
console.log('3 ' + res.toString());
})
1 我是第一个文本。
2 我是第二个文本。
3 我是第三个文本。
注:这里很明显generstor将所有read文件的命令抽出形成一个函数调用,但是由于yield使生成器函数执行暂停,yield关键字后面的表达式的值返回给生成器的调用者。它可以被认为是一个基于生成器的版本的return关键字。
于是与promise有了同样的效果。
但是,这样写依旧比较繁琐,就有了async的方法。
3、async函数
const fs = require('fs');
//nodejs的内置模块,由于读取文件一般是由异步执行,这样不会阻塞别的功能代码执行
//把fs封装成一个Promise对象,然后在下面返回数据输出
const read = function(fileName) {
return new Promise((resolve ,reject ) => {
fs.readFile(fileName , (err,data) => {//异步。readFileSync(同步,阻塞下面代码执行)
if (err) {
reject(err);
} else {
resolve(data);
}
})
});
}
//async就代表异步,里面有个await(只能在async函数中使用)搭配使用
//每到await的地方就是程序需要等待执行后面的程序,语义化很强
async function readByAsync(){
const a1 = await read('1.txt');
const a2 = await read('2.txt');
const a3 = await read('3.txt');
console.log(a1.toString());
console.log(a2.toString());
console.log(a3.toString());
}
readByAsync();
我是第一个文本。
我是第二个文本。
我是第三个文本。
注:这里async将读操作,输出操作集成到一道函数中,省去了generstor函数中的then()调用,更加方便。