使用ES6中的Promise解决回调地狱的问题

首先简单介绍下Promise

解释在程序的注释里

//1.Promise是一个构造函数,我们可以new Promise()得到一个Promise的实例
//2.在Promise上,有两个函数,分别是resolve(成功之后的回调函数)和reject(失败之后的回调函数)
//3.在Promise构造函数的Prototype属性上,有一个.then()方法,只要是Promise构造函数创建的实例,
//都可以访问到.then()方法
//4.Promise表示一个异步操作,每当我们new一个Promise的实例,就表示一个具体的异步操作
//5.异步操作的结果两种状态:异步执行成功了,需要在内部调用成功的回调函数resolve把结果返回给调用者;
//                        异步执行失败了,需要在内部调用失败的回调函数reject把结果返回给调用者。
//6.由于是异步操作,内部拿到操作的结果后,无法使用return把操作的结果返回给调用者;这时候,只能
//使用回调函数的形式,来把成功或失败的结果,返回给调用者。
//7.可以在new出来的Promise实例上,调用.then()方法,预先为这个Promise异步操作指定成功(resolve)和失败(reject)的回调函数

const fs = require('fs')

//每当new一个promise实例,就会执行这个异步操作中的代码
// var promise = new Promise(function(){
// 	//这个function内部写的就是具体的异步操作
// 	fs.readFile('./1.txt','utf-8',(err,dataStr) => {
// 		if (err) {
// 			throw err
// 		}
// 		console.log(dataStr)
// 	})
// })

function getFileByPath(fpath){
	return new Promise(function(resolve,reject){
	//这个function内部写的就是具体的异步操作
		fs.readFile(fpath,'utf-8',(err,dataStr) => {
		// if (err) {
		// 		throw err
		// }
		// console.log(dataStr)
		
			if (err) return reject(err)
			resolve(dataStr)

		})
	})
}

getFileByPath('./1.txt')
	.then(function(data){
		console.log(data+'-------')
	},function(err){
		console.log(err.message)
	})

接下来开始解决回调地狱的问题

注释掉的部分是解除后续Promise对前面Promise依赖的调用方式
(即哪怕前面的Promise执行失败了,但是不要影响后续Promise的正常执行。)

const fs = require('fs')

function getFileByPath(fpath){
	return new Promise(function(resolve,reject){
		fs.readFile(fpath,'utf-8',(err,dataStr) => {
		
			if (err) return reject(err)
			resolve(dataStr)

		})
	})
}

//先读取文件1,再读取2,最后读取3
//在上一个.then中返回一个新的Promise实例,可以继续用下一个.then来处理

//如果前面的Promise执行失败,我们不想让后续的Promise操作被终止,我们可以为每个promise制定失败的回调
// getFileByPath('./11.txt')
// 	.then(function(data){
// 		console.log(data)

// 		return getFileByPath('./2.txt')
// 	},function(err){
// 		console.log('这是失败的结果:'+err.message)
// 		//return一个新的Promise对象
// 		return getFileByPath('./2.txt')
// 	})
// 	.then(function(data){
// 		console.log(data)

// 		return getFileByPath('./3.txt')
// 	})
// 	.then(function(data){
// 		console.log(data)
// 	})

// console.log('OKOKOK')

//当我们的需求是:哪怕前面的Promise执行失败了,但是不要影响后续Promise的正常执行,此时,
//我们可以单独为每个promise,通过.then指定一下失败的回调。

//如果我们的需求是:如果后续的Promise依赖于前面Promise执行的结果,如果前面的失败了,则后面的
//就没有继续执行下去的意义了,此时我们想要实现一旦有报错就立即终止所有Promise的执行。

getFileByPath('./1.txt')
	.then(function(data){
		console.log(data)

		return getFileByPath('./22.txt')
	})
	.then(function(data){
		console.log(data)

		return getFileByPath('./3.txt')
	})
	.then(function(data){
		console.log(data)
	})
	.catch(function(err){//如果前面有任何的Promise执行失败,则立即终止所有Promise的执行,并
		// 马上进入catch去处理Promise中抛出的异常。
		console.log('这是自己的处理方式:'+err.message)
	})

猜你喜欢

转载自blog.csdn.net/wennianzhu/article/details/106491201