promise的含义
promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。
所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
Promise对象有以下两个特点。
- 对象的状态不受外界影响
- 一旦状态改变,就不会再变,任何时候都可以得到这个结果
基本用法
ES6 规定,Promise对象是一个构造函数,用来生成Promise实例。
// 定义一个promise对象,创建一个实例
const promise = new Promise(function (resolve, reject) {
// resolve定义成功的状态
// reject定义失败的状态
// 模拟进行异步操作
setTimeout(() => {
// resolve('成功了')
reject('失败了')
}, 1000);
})
promise.then((value) => {
// 成功的回调
console.log(value);
}), (error => {
// 成功的回调
console.error(error);
})
使用pormise封装ajax
// 使用promise 封装ajax请求
const p = new Promise((resolve, reject) => {
// 创建xml对象
const xhr = new XMLHttpRequest();
// 初始化请求
xhr.open('GET', 'https://static.chexx01.cn/images/omc/815770d8-647e-479d-8a3b-89e600679970.jpg')
// 发送请求
xhr.send()
// 获取状态码,处理响应结果
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status >= 200 && xhr.status < 300) {
resolve(xhr.response)
} else {
reject(xhr.status)
}
}
}
})
p.then(value => {
console.log(value);
}), function (err) {
console.error(err);
}
使用promise对文件进行操作
const fs = require('fs');
// 原生写法
fs.readFile('./1.md', (err, data) => {
if (err) {
throw (err)
}
// 需要用转成字符串,因为刚开始的数据是Buffer
console.log(data.toString());
})
// 使用promise进行封装
const p = new Promise((resolve, rejects) => {
fs.readFile('./1.m3d', (err, data) => {
if (err) {
rejects(err)
} else {
resolve(data)
}
})
})
p.then((value) => {
console.log(value.toString());
}), function (error) {
console.error('读取文件失败');
}
promise的then的链式调用
需求:读取多个文件,并把他们合拼
// 原生写法
fs.readFile('./1.md', (err, data1) => {
fs.readFile('./2.md', (err, data2) => {
fs.readFile('./3.md', (err, data3) => {
let result = data1 + '\r\n' + data2 + '\r\n' + data3 + '\r\n'
console.log(result);
})
})
})
// promise的then的链式调用
const p = new Promise((resolve, rejects) => {
fs.readFile('./1.md', (err, data) => {
if (err) {
rejects(err)
} else {
resolve(data)
}
})
})
p.then((value) => {
return new Promise((resolve, rejects) => {
fs.readFile('./2.md', (err, data) => {
if (err) {
rejects(err)
} else {
resolve([value, data])
}
})
})
}).then((value) => {
return new Promise((resolve, rejects) => {
fs.readFile('./3.md', (err, data) => {
resolve([value, data])
})
})
}).then(value => {
console.log(value.toString());
})
更多资料
https://www.yuque.com/ostwind/es6/docs-promise#b267cd07