同步API:只有当前API执行完成后,才能继续执行下一个API
console.log('before');
console.log('after');
异步API:当前API的执行不会阻塞后续代码的执行
console.log('before');
setTimeout(
()=>{
console.log('last');
},2000);
console.log('after');
代码会优先依次执行同步代码再依次执行异步代码,异步代码的结果不能通过返回值得到,需要通过回调函数,如果想要先执行异步代码,必须把同步代码写在异步的回调函数中,但是会造成代码嵌套,难以维护
例:
Promise出现的目的是为了解决异步编程中代码嵌套的问题
把异步代码写在new Promise的对象里面
let promise = new Promise((resolv,reject) => {
setTimeout(() => {
if(true){
//把异步执行成功的时候用resolve函数把结果传递出去
resolve({name:'张三'});
}else{
//把异步执行失败的结果传递出去
reject('失败了');
}
},2000);
});
//resolve执行的就是promise.then里面的result函数
promise.then(result => console.log(result);//{name:'张三'})
.catch(error => console.log(error)//失败了);
示例代码:
const fs = require('fs');
let promise = new Promise((resolve,reject) => {
fs.readFile('./1.txt','utf8',(err,result) => {
if(err != null){
reject(err);
}else{
resolve(result);
}
});
});
promise.then((result) => {
console.log(result);
})
.catch((err) => {
console.log(err);
})
promise对象可以连续.then(),第一个then()中的回调函数中返回的promise对象是第二个then()的调用者
异步函数:简便化promise对象的使用
1.在普通函数定义的前面加上async关键字,普通函数就变成了异步函数
2.异步函数默认的返回值是promise对象
3.代码执行成功则直接使用return返回对象,失败则使用throw抛出错误信息
const fn = async () => {};
async function fn () {}
await关键字:
1.它只能出现在异步函数中
2.await后面只能跟promise对象,它可以暂停异步函数的执行,等待promise对象返回结果后再向下执行
实例代码:依次输出r1 r2 r3
可以把一个函数封装成返回promise对象的函数:
const promisify = require(‘util’).promisify;
让readFile函数有返回promise对象
const readFile = promisify(fs.readFile);
await后面跟promise对象,会自动执行.then()方法,可以直接获得需要的信息
let r1 = await readFile(’./1.txt’,‘utf8’);