Node

5. Node.js异步编程

5.1 同步API,异步API

//路径拼接
const public = path.join(__dirname,'public');
//请求地址解析
const urlObj = url.parse(req,url);
//读取文件
fs.readFile('./demo.txt','utf8',(err,result)=>{
	console.log(result)
})

同步API:只有当前API执行完成后,才能继续执行下一个API

console.log('before')
console.log('after')

异步API:当前API的执行不会阻塞后续代码的执行

console.log('before')
setTimeout(
	()=>{console.log('last')
},2000)
console.log('after')

5.2 同步API,异步API的区别(获取返回值)

同步API可以从返回值中拿到API执行的结果,但是异步API是不可以的

//同步
function sum (n1,n2){
	return n1 + n2
}
const result = sum(10,20)
//异步
function getMsg(){
	setTimeout(function(){
		return {msg:'Hello Node.js'}
	},2000)
}
const msg=getMsg()

5.3 回调函数

自己定义函数让别人去调用

//getData函数定义
function getData(callback){
	//getData函数调用
	getData(()=>{})
}

5.4 同步API,异步API的区别(代码执行顺序)

同步API从上到下依次执行,前面代码会阻塞后面代码的执行

for(var i = 0; i < 1000000;i++){
	console.log(i)
}
console.log('for循环后面的代码')

异步API不会等待API执行完成后再向下执行代码

console.log('代码开始执行')
setTimeout(()=>{console.log('2秒后执行的代码')},2000)
setTimeout(()=>{console.log('0秒后执行的代码')},0)
console.log('代码结束执行')

5.5 Node.js中的异步API

fs.readFile('./demo.txt',(err,result)=>{})
var server =http.createServer();
server.on('request',(req,res)=>{})

如果异步API后面代码的执行依赖当前异步API的执行结果,但实际上后续代码在执行的时候异步API还没有返回结果,这个问题怎么解决呢?
需求:依次读取A文件,B文件,C文件

5.6 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)});//失败了

5.7 异步编程

异步函数是异步编程语法的终极解决方案,它可以让我们将异步代码写成同步的形式,让代码不再有回调函数嵌套,使代码变得清晰明了。

const fn = async ()=>{}
const function fn(){}

async 关键字

  1. 在普通函数定义的前面加上async关键字 普通函数就变成了异步
  2. 异步函数默认的返回值是promise对象
  3. 在异步函数内部使用return关键字进行结果返回 结果会被包裹在promise对象中 return关键字代替了resolve方法
  4. 在异步函数内部使用throw关键字进行错误的抛出
  5. 调用异步函数再链式调用then方法获取异步函数执行结果
  6. 调用异步函数再链式调用catch方法获取异步函数执行的错误信息
    await 关键字
  7. 它只能出现在异步函数中
  8. await promise 它可以暂停异步函数的执行等待promise对象返回结果后再向下执行函数
  9. await关键字可是暂停异步函数向下执行 直到promise返回结果
async function fn(){
	throw '发生了一些错误';
	return 123;
}
fn().then(function(data){
	console.log(data)
}).catch(function(err){
	console.log(err)
})
async function p1(){
	return 'p1'
}
async function p2(){
	return 'p2'
}
async function p3(){
	return 'p3'
}
async function run () {
	let r1 =await p1()
	let r2 =await p2()
	let r3 =await p3()
	console.log(r1)
	console.log(r2)
	console.log(r3)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值