回调地狱callback-hell

回调地狱callback-hell

同样是读文件的操作,因为读文件是异步操作所以文件的读取并不会按照代码的顺序来输出

var fs = require('fs')

fs.readFile('./a.txt','utf8',function(err,data){
	if(err){
		throw err
	}console.log(data)
})

fs.readFile('./b.txt','utf8',function(err,data){
	if(err){
		throw err
	}console.log(data)
})

fs.readFile('./c.txt','utf8',function(err,data){
	if(err){
		throw err
	}console.log(data)
})

[外链图片转存失败(img-p3z0TT9O-1564741746893)(C:\Users\14331\AppData\Roaming\Typora\typora-user-images\1564382564978.png)]

若想要实现顺序读取,则要使用代码嵌套的方式,此时执行过程为必须等a输出后才会读b,必须b输出后才会读c即回调地狱,将b放到a的回调函数里面,将c放到b的回调函数里面。

var fs = require('fs')

fs.readFile('./a.txt','utf8',function(err,data){
	if(err){
		throw err
	}console.log(data)
	fs.readFile('./b.txt','utf8',function(err,data){
	if(err){
		throw err
	}console.log(data)
	
fs.readFile('./c.txt','utf8',function(err,data){
	if(err){
		throw err
	}console.log(data)
})
})
})

[外链图片转存失败(img-enrEUQxy-1564741746896)(C:\Users\14331\AppData\Roaming\Typora\typora-user-images\1564382726972.png)]

使用promise方法解决

[外链图片转存失败(img-PcV76fNz-1564741746899)(C:\Users\14331\AppData\Roaming\Typora\typora-user-images\1564387060256.png)]

[外链图片转存失败(img-YD3KwmEP-1564741746900)(C:\Users\14331\AppData\Roaming\Typora\typora-user-images\1564387012232.png)]

var fs = require('fs')

//new Promise()创建一个promise容器,promise是ES6的语法,当它被创建时会自动调用
//promise容器有三种状态,第一种为pendding正在执行态,jejected已经失败态,resolved已经成功态
var p1 = new Promise(function(resolve,reject){
	fs.readFile('./a.txt','utf8',function(err,data){
	if(err){
		reject(err)
	}else{
		resolve(data)//成功后执行then,function(data)=resolve(data)
	}
})
})

var p2 = new Promise(function(resolve,reject){
	fs.readFile('./b.txt','utf8',function(err,data){
	if(err){
		reject(err)
	}else{
		resolve(data)
	}
})
})

var p3 = new Promise(function(resolve,reject){
	fs.readFile('./c.txt','utf8',function(err,data){
	if(err){
		reject(err)
	}else{
		resolve(data)
	}
})
})


//此时的data就是读取成功返回的数据,第一个参数就是resolve(data),第二个参数就是reject(err)
p1.then(
	function(data){
	console.log(data)
	return p2//此时返回的时p2实例
	},
	function(err){
	console.log('读取文件失败了',err)
}).then(
	function(data){
	console.log(data)
	return p3//此时返回的时p3实例
	},
	function(err){
	console.log('读取文件失败了',err)
}).then(
	function(data){
	console.log(data)
	},
	function(err){
	console.log('读取文件失败了',err)
})
封装promise方法
var fs = require('fs')

//new Promise()创建一个promise容器,promise是ES6的语法,当它被创建时会自动调用
//promise容器有三种状态,第一种为pendding正在执行态,jejected已经失败态,resolved已经成功态
function  Preadfile(pathfile){
	return new Promise(function(resolve,reject){
	fs.readFile(pathfile,'utf8',function(err,data){
	if(err){
		reject(err)
	}else{
		resolve(data)
	}
})
})
}



Preadfile('./a.txt')
	.then(function(data){
	console.log(data)
	return Preadfile('./b.txt')
}).then(function(data){
	console.log(data)
	return Preadfile('./c.txt')
}).then(function(data){
	console.log(data)
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值