这是一篇很初级的有关Promise的知识整理,还有很多的知识点正在进行中...
什么是Promise
Promise
中文的含义:许诺。为啥叫这个名字?可能是因为它的状态一旦发生,就无法再改变了,就像是做出了许诺。
参照阮一峰老师《ES6标准入门》一书中的说法:Promise是一个容器,里面保存着某个未来才会结束的事件。从语法上来说,Promise是一个对象,从它可以获取异步操作的消息。
Promise
的特点
-
三种状态
1.1 进行中-pending
1.2 已成功-fulfilled
1.3 已失败-rejected
上面的三种状态一旦发生,就不再改变,任何时候都能得到这个结果。 -
无法取消
一旦新建,就会立刻执行,无法中途取消。 -
可以链式调用
根据这个特点,可以避免回调地狱
一个简单的例子
function timeout(ms) { // 返回一个Promise实例
return new Promise((resolve, reject) => {
setTimeout(resolve, ms, 'ok') // 当经过ms时间后,事件发生
})
}
timeout(100).then((value) => {
console.log(value) // ok
})
用Promise
解决回调地狱
阅读性不好的callBack hell
const fs = require('fs')
let data = ''
fs.readFile('a.txt', 'utf-8', (err, data_1) => { // 读取文件 a.txt
if (err) throw err
data += data_1
fs.readFile('b.txt', 'utf-8', (err, data_2) => { // 读取文件 b.txt
if (err) throw err
data += data_2
fs.readFile('c.txt', 'utf-8', (err, data_3) => { // 读取文件 c.txt
if (err) throw err
data += data_3
console.log(data_2, data)
})
})
})
用Promise重写
function read(fileUrl) {
return new Promise((resolve, reject) => {
fs.readFile(fileUrl, 'utf-8', (error, data) => {
error && reject(error)
resolve(data)
})
})
}
let fileData = ''
read('a.txt')
.then((data) => {
console.log(data, '文件a')
fileData += data
return read('b.txt')
})
.then((data) => {
console.log(data, '文件b')
fileData += data
return read('c.txt')
})
.then((data) => {
console.log(data, '文件c')
fileData += data
console.log(fileData)
})
.then
- 任何时候,
then
方法都会返回一个新的Promise对象 - 如果在
then
方法中,显式的return一个非Promise对象,那么这个结果就作为下一个then
方法的参数 - 如果return返回的是一个Promise对象,就作为一个新的Promise对象来使用
.all
, .race
all
生成并返回一个新的Promise对象,当所有的Promise对象都成功之后,执行某些操作。如果某个promise对象变为reject,则Promise.all就会立刻终止,并返回一个reject的新的promise对象
race
是指,在多个Promise对象中,只要有一个成功了,就执行某些操作
明天还有...
---continue---
网友评论