// 同步api
console.log('before');
console.log('after');
打开终端
执行 node.js 01api.js 按下Tab键,回车
结果是
添加定时器
// 同步api
console.log('before');
//添加定时器测试代码执行顺序
setTimeout(()=>{console.log('last');},2000);
console.log('after');
// 同步API
function sum(a,b){
return a+b;
}
const result = sum(10,20);
console.log(result); //30
//异步
function getMsg() {
setTimeout(()=>{
return{
msg:'hello,槿花荣'
}
},2000)
}
const msg = getMsg()
console.log(msg); //undefined
运行效果:
03.
// 在异步API中无法用返回值拿到结果,但是可以通过回调函数获取值
function getData(callback) {
callback('123'); //callback在这里是个回调函数
}
getData((n)=>{
//当callback回调函数里面包含参数,在getData函数调用里面
//匿名函数要放入一个形参接受回调函数的值
console.log('callback函数被调用了');
console.log(n);
})
04.
//同步API的执行顺序:从上至下依次执行,前面的代码会阻塞后面的代码的执行
for(var i=0;i<=100;i++){
console.log(i);
}
console.log('for循环后面的语句');
05.
console.log('start');
setTimeout(()=>{console.log('2s');},2000);
setTimeout(()=>{console.log('0s');},0);
console.log('end');
回调地狱问题
此处是06callbackhell.js文件
另外里面的a.txt b.txt c.txt 文件但是要自己准备的
//依次计取A文件B文件C文件
const fs = require('fs')
fs.readFile('./a.txt','utf8',(err,result1)=>{
console.log(result1);
fs.readFile('./b.txt','utf8',(err,result2)=>{
console.log(result2);
fs.readFile('./c.txt','utf8',(err,result3)=>{
console.log(result3);
})
})
})
运行效果图如下:
使用promise解决
07.promise.js文件代码如下:
// 利用promise解决回调地狱的问题
// const rejects = require('assert');
const fs = require('fs')
//resolve,rejects都是函数参数
// resolve(value)可以将promise对象的状态设置为fulfilled,并将value作为失败的原因传递给后续的catch方法
// rejects(reason)可以将promise对象的状态设置为rejected,并将reason作为失败的原因传递给后续的then方法
function p1(){
return new Promise((resolve,rejects)=>{
fs.readFile('./a.txt','utf8',(err,result)=>{
resolve(result);
});
});
}
function p2(){
return new Promise((resolve,rejects)=>{
fs.readFile('./b.txt','utf8',(err,result)=>{
resolve(result);
});
});
}
function p3(){
return new Promise((resolve,rejects)=>{
fs.readFile('./c.txt','utf8',(err,result)=>{
resolve(result);
});
});
}
p1().then((r1)=>{
console.log(r1);
return p2(); //只用p2()返回一个Promise对象,会在下一个then()中拿到promise对象的结果
}).then((r2)=>{
console.log(r2);
return p3();
}).then((r3)=>{
console.log(r3);
console.log('end');
})
语法知识点升级async关键字
1.普通函数定义前加async关键字,普通函数变成异步函数
2.异步函数默认返回promise对象
3.在异步函数内部使用return关键字进行结果返回,结果会被 包裹的promise对象中return关键字代替了resolve方法
4.在异步函数内部使用throw关键字抛出程序异常
5.调用异步函数再链式调用then方法获取异步函数执行结果
08promise.js文件代码如下:
// 1.普通函数定义前加async关键字,普通函数变成异步函数
// 2.异步函数默认返回promise对象
// 3.在异步函数内部使用return关键字进行结果返回,结果会被 包裹的promise对象中return关键字代替了resolve方法
// 4.在异步函数内部使用throw关键字抛出程序异常
// 5.调用异步函数再链式调用then方法获取异步函数执行结果
async function fn(){
throw '发生了一个很小的错误,导致后面的代码不再执行了' //throw代替了reject()方法
return 123; //return代替了resolve()方法
}
// console.log(fn());
fn().then(data =>{
console.log(data); //使用回调函数的方法获取promise对象的返回值
}).catch(error=>{ //捕获throw抛出的错误
console.log(error);
})