(一)同步API,异步API
[1]. 回调函数
function getData (callback){}
getData(()=>{})
[2]. 用回调函数获取异步函数中的值
function fun(callback){
setTimeout(()=>{
const val = 'hello world';
callback(val)
},2000)
}
fun((value)=>{
console.log(value);
})
[3].代码执行顺序
- 同步代码,会被放到同步代码执行区中,异步代码会被放到异步代码执行区中,将异步代码中的回调函数,放入到回调函数队列
- 当同步代码执行区中的代码执行完毕后,执行异步代码执行去中的代码,当异步代码执行区的某行代码被执行时,会将该代码对应的在回调函数队列中的回调函数放入同步代码执行区
- 同步代码执行区的代码开始执行
function f1(){ //异步代码 setTimeout(()=>{ //异步代码中的回调韩束 console.log('2秒后执行'); },2000) } function f2(){ setTimeout(()=>{ console.log('0秒后执行'); },0) } function f3(){ console.log('同步执行'); } f1(); f2(); f3(); //结果:同步执行》0秒后执行》2秒后执行
(二) Node.js中的异步API
[1]. Promise
Promise出现的目的是解决Node.js异步编程中回调地狱的问题。
在读取1.txt完成后读取2.txt,读取完成后读取3.txt
const fs = require('fs');
function fRead1() {
return new Promise((resolve, reject) => {
fs.readFile('./1.txt', 'utf8', (err, result) => {
if (err) {
reject(err);
} else {
resolve(result);
}
})
});
}
function fRead2() {
return new Promise((resolve, reject) => {
fs.readFile('./2.txt', 'utf8', (err, result) => {
if (err) {
reject(err);
} else {
resolve(result);
}
})
});
}
function fRead3() {
return new Promise((resolve, reject) => {
fs.readFile('./3.txt', 'utf8', (err, result) => {
if (err) {
reject(err);
} else {
resolve(result);
}
})
});
}
fRead1().then((result) => {
console.log(result);
return fRead2();
}).then((result) => {
console.log(result);
return fRead3();
}).then((result) => {
console.log(result);
})
[2]. async和await (ES7)
1). async关键字
- 在普通函数定义的前面加上async关键字,普通函数就变成了异步函数。
- 异步函数默认的返回值就是promise对象。
- 在异步函数内部使用return关键字进行结果返回 结果会被包裹的promise对象中 return关键字代替了resolve方法
- 异步函数内部使用throw关键字进行错误的抛出。
- 调用异步函数再链式调用then方法获取异步函数执行结果
- 调用异步函数再链式调用catch方法获取异步函数执行的错误信息
2). await关键字
- 它只能出现在异步函数中
- await后面只能写promise对象 写其他类型的API是不可以的
- await关键字可是暂停异步函数向下执行 直到promise返回结果
3). 读取文件
const fs = require('fs');
//改造现有异步函数api 让其返回promise对象,从而支持异步函数语法
const promisify = require('util').promisify;
//调用promisify方法改造现有异步API,让其返回promise对象
const readFile = promisify(fs.readFile);
console.log('%s',readFile)
async function run(){
let r1 = await readFile('./1.txt', 'utf8');
let r2 = await readFile('./2.txt', 'utf8');
let r3 = await readFile('./3.txt', 'utf8');
console.log(r1);
console.log(r2);
console.log(r3);
}
run()