文件结构
一般解决异步问题的方法:
1,promise
const fs = require('fs');
const readFile = function (fileName) {
return new Promise((resolve, reject) => {
fs.readFile(fileName, (err, data) => {
if (err) reject (err);
resolve(data);
});
});
}
readFile('data/a.txt').then((res) => {
console.log(res.toString());
return readFile('data/b.txt');
}).then((res) => {
console.log(res.toString());
return readFile('data/c.txt');
}).then((res) => {
console.log(res.toString());
})
2,generator
const fs = require('fs');
const readFile = function (fileName) {
return new Promise((resolve, reject) => {
fs.readFile(fileName, (err, data) => {
if (err) reject (err);
resolve(data);
});
});
}
function * gen () {
yield readFile('data/a.txt');
yield readFile('data/b.txt');
yield readFile('data/c.txt');
}
let g1 = gen();
g1.next().value.then((res) => {
console.log(res.toString());
return g1.next().value;
}).then((res) => {
console.log(res.toString());
return g1.next().value;
}).then((res) => {
console.log(res.toString());
return g1.next().value;
})
3,async
const fs = require('fs');
const readFile = function (fileName) {
return new Promise((resolve, reject) => {
fs.readFile(fileName, (err, data) => {
if (err) reject (err);
resolve(data);
});
});
}
async function fun () {
let f1 = await readFile('data/a.txt');
console.log(f1.toString());
let f2 = await readFile('data/b.txt');
console.log(f2.toString());
let f3 = await readFile('data/c.txt');
console.log(f3.toString());
}
fun();
----------------------------------------------------------------------------
在一个函数前面加上async之后,就表示这个函数里面有异步的任务
await后面加上一条语句,表示后面的结果需要等待
async的特点:
1,await只能放到async函数当中
2,相比generator,语义化更好
3,await后面可以是promise对象,也可以是数字,字符串,布尔
4,async函数返回一个promise对象
5,只要当await后面的promise对象的状态变成了reject的时候,接下来的语句就中断了,即整个async函数就会中断
一般在网络请求当中,一般都使用try catch来抛出错误