//Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大
// Promise简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
// 实例化Promise对象
// 有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。
// 只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。
// 这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。
// 一旦状态改变,就不会再变,任何时候都可以得到这个结果。
const a = new Promise((resolve, reject) => {
setTimeout(() => {
// let data = 'success'
// resolve(data)
let error = 'failed'
reject(error)
}, 1000)
})
// 一般.then回调成功resolve方法,.catch获取.reject回调
// .then后面跟两个方法第二个默认为reject的回调,外部catch就无法捕捉reject回调了
a.then((response) => {
// 调用resolve
console.log(response)
}, (error) => {
// 调用resolve
console.log(error + '1')
})
a.then((response) => {
// 调用resolve
console.log(response)
}).catch((error) => {
// 调用resolve
console.log(error + '2')
})
// 读取文件的内容,确认已安装node
const fs = require('fs');
const { resolve } = require('path')
// fs.readFile('./data.json',(err,data)=>{
// 读取失败抛出错误
// if(err) throw err;
// 成功输出内容
// console.log(data.toString());
// });
// const readJson = new Promise((resolve, reject) => {
// fs.readFile('./data/data.json', (err, data) => {
// if (err) reject(err);
// resolve(data)
// });
// })
// readJson.then((data) => {
// console.log(data.toString())
// }).catch((error) => {
// console.log(error)
// console.log('读取失败')
// })
// 封装ajax
// let req = new Promise((resolve, reject) => {
// const xhr = new XMLHttpRequest();//创建对象
// xhr.open("GET", "https://api.apiopen.top/getJoke1");//初始化
// xhr.send();//发送请求
// xhr.onreadystatechange = () => {
// console.log(xhr.readyState)
// 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)
// }
// }
// }
// })
// let result = req.then((response) => {
// console.log(JSON.parse(response).code)
// })
// req.catch((error) => {
// console.log(error)
// })
// then方法的返回结果也是Promise对象,状态由回调函数的执行结果决定
// 1、如果回调函数返回结果为非promise类型的属性则状态为成功 ,返回值为对象的成功值
// console.log(result)
const req2 = new Promise((resolve, reject) => {
setTimeout(() => {
// let data = 'success'
// resolve(data)
let error = 'failed'
resolve(123)
}, 1000)
})
// result2的也是promise,由回调函数的执行结果决定
result2 = req2.then((response) => {
console.log(response)
// 1、非Promise类型的属性由req2的结果决定
// return '2'
// 2、promise对象则由下面这个promise对象决定
// return new Promise((resolve,reject)=>{
// resolve('success')
// reject('error')
// })
// 3、抛出错误结果是失败的
throw new Error('error2')
})
result2.then((data)=>{
console.log(data)
}).catch(error=>{
console.log(error)
})
// Promise可以链式调用
let p = new Promise(resolve=>{
setTimeout(()=>{
resolve('111')
},2000)
})
p.then(rep=>{
console.log(rep)
return new Promise(resolve=>{
setTimeout(()=>{
resolve('222')
})
},2000)
}).then(rep=>{
console.log(rep)
return new Promise(resolve=>{
setTimeout(()=>{
resolve('333')
})
},3000)
}).then(rep=>{
console.log(rep)
return new Promise((resolve,reject)=>{
setTimeout(()=>{
reject('444')
})
})
}).catch(rep=>{
console.log(rep)
})
const fs = require('fs')
const readJson = new Promise((resolve, reject) => {
fs.readFile('./es6/20201003/data/data.json', (err, data) => {
if (err) reject(err);
resolve(data)
});
})
let arr = []
readJson.then((data) => {
console.log(data.toString())
arr.push(data.toString())
return new Promise(resolve=>{
fs.readFile('./es6/20201003/data/data1.json', (err, data) => {
if (err) reject(err);
resolve(data)
});
})
}).then((data) => {
console.log(data.toString())
arr.push(data.toString())
return new Promise(resolve=>{
fs.readFile('./es6/20201003/data/data2.json', (err, data) => {
if (err) reject(err);
resolve(data)
});
})
}).then((data) => {
arr.push(data.toString())
console.log(data.toString())
console.log(arr)
})