promise

promise基本概念

promise用来解决回调地狱问题,使代码更加优雅简洁,方便维护

  • promise是Ecamscript 6 中新增的一个API
  • promise 本身是一个容器,里面封装了异步任务。
  • 这个异步任务本身的默认状态为pending,
    • 当任务执行成功时转为resolve
    • 当失败时转为rejected
  • promise本身并不是异步的,但其内部封装的大部分是异步任务
  • promise 是一个构造函数,容器一旦建立就会执行里面的代码
  • promise基本概念图示

  • 在这里插入图片描述

promise基本代码

var fs = require('fs')

var p1 = new Promise(function (resolve, reject) {
	fs.readFile('./data/a.txt','utf8',function (err,data) {
		if(err) {
			//如果任务失败了,就把pending改为rejected状态
			//调用reject相当于调用了then()方法的第二个参数方法
			reject(err)
		} else {
			//如果任务成功了,就把pending改为resolve状态
			//调用resolve相当于调用了then()方法的第一个参数方法
			resolve(data)
		}
	});
})
//p1就是那个承诺
//.then() 当P1成功了,然后(then)做指定的操作
//then方法接收的function就是容器中的resolve()和reject()
p1
	.then(function (data) {
		console.log(data);
	}, function (err) {
		console.log('读取文件失败了',err)
	})

promise 基本代码图示

在这里插入图片描述

可直接return一个promise对象

只返回一些数据并没有什么意义,promise最强大的地方在于可以返回一个promise对象,然后在后面的then中操作

  • 当return一个promise对象时,

    • 后续的then中的方法中的第一个参数会作为一个p2的resolve()
    • 第二个参数作为p2的reject()
具体代码
var fs = require('fs')

new Promise(function (resolve, reject) {
	fs.readFile('./data/a.txt','utf8',function (err,data) {
		if(err) {
			//如果任务失败了,就把pending改为rejected状态
			//调用reject相当于调用了then()方法的第二个参数方法
			reject(err)
		} else {
			//如果任务成功了,就把pending改为resolve状态
			//调用resolve相当于调用了then()方法的第一个参数方法
			resolve(data)
		}
	});
})

var p2 = new Promise(function (resolve, reject) {
	fs.readFile('./data/b.txt','utf8',function (err,data) {
		if(err) {
			//如果任务失败了,就把pending改为rejected状态
			//调用reject相当于调用了then()方法的第二个参数方法
			reject(err)
		} else {
			//如果任务成功了,就把pending改为resolve状态
			//调用resolve相当于调用了then()方法的第一个参数方法
			resolve(data)
		}
	});
})
//p1就是那个承诺
//.then() 当P1成功了,然后(then)做指定的操作
//then方法接收的function就是容器中的resolve()和reject()
p1
	.then(function (data) {
		console.log(data);
		//可以return一个promise对象
		//当return一个promise对象时,
		// 后续的then中的方法中的第一个参数会作为一个p2的resolve()
		// 第二个参数作为p2的reject()
		return p2
	}, function (err) {
		console.log('读取文件失败了',err)
	})
	.then(function(data) {
		console.log(data);
	})

promise的API的封装

var fs = require('fs')
//pReadFile()为回调函数,filePath为文件路径参数
function pReadFile(filePath) {
//直接返回一个promise对象
	return new Promise (function (resolve, reject) {
		fs.readFile(filePath,'utf8', function(err, data) {
			if(err) {
				reject(err)
			} else {
				resolve(data)
			}
		});
	})
}

//调用回调函数
pReadFile('./data/a.txt')
//.then 的第一个参数函数是resolved处理,第二个是rejected处理
	.then(function (data) {
		console.log(data)
		return pReadFile('./data/b.txt')
	})
	.then(function(data) {
		console.log(data)
	})
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐