Promise
1. 实例化 Promise 对象
const p = new Promise(function(resolve, reject){
setTimeout(function() {
let data = '数据读取成功'
resolve(data)
}, 1000)
})
// 调用 then 方法
p.then(function(val){ console.log(val) }, function(err){}) // 打印 '数据读取成功'
2. 使用 Promise 封装
let path = './poem.txt' // 需要读取文件的相对路径
let p = new Promise((resolve, reject) => {
fs.readFile(path, (err, data) => {
if (err) reject(err)
resolve(data)
})
})
p.then(
val => {
console.log(val.toString())
},
err => {
console.log(err)
}
)
// 封装 AJAX
const p = new Promise((resolve, reject) => {
// 创建对象
const xhr = new XMLHttpRequest()
// 初始化
xhr.open('GET', 'https://api.apiopen.top/getJoke')
// 发送
xhr.send()
// 绑定事件,处理响应结果
xhr.onreadystatechange = function() {
if(xhr.readyState === 4) {
if(xhr.status >= 200 && xhr.status < 300 ){
// console.log(xhr.response)
resolve(xhr.response)
} else {
// console.log(xhr.status)
reject(xhr.status)
}
}
}
})
p.then(
val => {
console.log(val)
},
err => {
console.log(err)
}
)
3. then
// then 返回的结果是 Promise 对象,对象的状态由回调函数的执行结果决定
// 如果回调函数中返回的结果是非 Promise 类型的属性,状态则为成功,返回值为对象的成功的值
const fs = require('fs')
const path1 = './poem1.txt'
const path2 = './poem2.txt'
const p = new Promise((resolve, reject) => {
fs.readFile(path1, (err, data) => {
if(err) reject(err)
resolve(data)
})
})
p.then(
val => {
return new Promise((resolve, reject) => {
fs.readFile(path2, (err, data) => {
if(err) reject(err)
resolve([val, data])
})
})
},
err => {
console.log(err)
}
).then(
val => {
console.log(val.join('\n\n').toString())
},
err => {
console.log(err)
}
)