同步API,异步API
同步API:只有当前API执行完成后,才能继续执行下一个API
``` console.log('before'); console.log('after'); ```异步API:当前API的执行不会阻塞后续代码的执行
``` console.log('before'); setTimeout(function(){ console.log('last') },2000) console.log('after'); ```同步API,异步API的区别(获取返回值)
同步API可以从返回值中拿到API执行的结果,但是异步API不可以的
回调函数
自己定义函数让别人去调用
``` function getData(callback){ callback() } getData(function(){ console.log('callback函数被调用了') }) ``` ``` function getData(callback){ callback('糖糖糖') } getData(function(n){ console.log('callback函数被调用了') console.log(n) }) ``` ``` function getMsg(callback){ setTimeout(function(){ callback({ msg:'hello node.js' }) },2000) } getMsg(function(data){ console.log(data) }) ```同步API,异步API的区别(代码执行顺序)
同步API从上到下依次执行,前面代码会阻塞后面代码的执行
异步API不会等待API执行完成后再向下执行代码
Promise
Promise 出现的目的是解决Node.js异步编程中回调地狱的问题
``` let promise = new Promise((resolve,reject)=>{ setTimeout(()=>{ if(true){ resolve({name:'林一一'}) }else{ reject('失败了') } },2000); }); promise.then(result=>console.log(result);//{name:'林一一'}) .catch(error=>console.log(error);//失败了) ``` ``` //回调地狱 const fs = require('fs'); fs.readFile('./1.txt','utf8',(err,result1)=>{ console.log(result1) fs.readFile('./2.txt','utf8',(err,result2)=>{ console.log(result2) fs.readFile('./3.txt','utf8',(err,result3)=>{ console.log(result3) }) })})
//promise解决回调地狱
const fs = require('fs');
function p1(){
return new Promise((resolve,reject)=>{
fs.readFile('./1.txt','utf8',(err,result)=>{
resolve(result);
})
})
}
function p2(){
return new Promise((resolve,reject)=>{
fs.readFile('./2.txt','utf8',(err,result)=>{
resolve(result);
})
})
}
function p3(){
return new Promise((resolve,reject)=>{
fs.readFile('./3.txt','utf8',(err,result)=>{
resolve(result);
})
})
}
p1().then((r1)=>{
console.log(r1)
return p2()
}).then((r2)=>{
console.log(r2)
return p3()
}).then((r3)=>{
console.log(r3)
})
const fs = require('fs');
let promise = new Promise((resolve,reject)=>{
fs.readFile('./100.txt','utf8',(err,result)=>{
if(err !=null){
reject(err);
}else{
resolve(result);
}
})
})
promise.then((result)=>{
console.log(result);
}).catch((err)=>{
console.log(err)
})