13.Promise
Promise介绍
Promise是ES6引入的异步编程的新解决方案。语法上Promise是一个构造函数,用来封装异步操作并可以获取其成功或失败的结果。
- Promise构造函数:Promise(excutor){}
- Promise.prototype.then方法
- Promise.prototype.catch方法
//实例化 Promise 对象
const p = new Promise(function(resolve,reject){
setTimeout(function(){
//
let date = '数据库中的用户数据';
//resolve
resolve(data);
let err = '数据读取失败';
reject(err);
},1000);
})
//调用promise对象的then方法
p.then(function(value){
console.log(value);//数据库中的用户数据
},function(reason){
console.log(reason);//数据读取失败
})
Promise封装读取文件
//1.引入fs模块
const fs = require('fs');
//2.调用方法读取文件
//fs.readFile('./resources/为学.md',(err,data)=>{
// //判断失败 则抛出错误
// if(err) throw err;
// //如果没有出错,则输出内容
// console.log(data.toString());
//})
//3.使用Promise封装
const p = new Promise(function(resolve,reject){
fs.readFile('./resources/为学.md',(err,data)=>{
//判断如果失败
if(err) reject(err);
//如果成功
resolve(data)
})
})
//调用promise对象的then方法
p.then(function(value){
console.log(value。toString());
},function(reason){
console.log('读取失败');
})
Promise封装AJAX
//接口地址 https:api.apiopen.top/getJoke
const p = new Promise((resolve,reject)=>{
//1.创建对象
const xhr = new XMLHttpRequest();
//2.初始化
xhr.open('GET',"https:api.apiopen.top/getJoke");
//3.发送
xhr.send();
//4.绑定事件,处理响应结果
xhr.onreadystatechange = function(){
//判断
if(xhr.readyState === 4){
//判断响应状态码 200-299
if(xhr.status >= 200 && xhr.status < 300){
//表示成功
resolve(xhr.response);
}else{
//如果失败
reject(xhr.status);
}
}
}
})
//指定回调
p.then(function(value){
console.log(value);
}function(reason){
console.log(reason);
})
Promise.prototype.then方法
//创建Promise对象
const p = new Promise(function(resolve,reject){
setTimeout(function(){
resolve('用户数据');
//reject('出错了');
},1000);
})
//调用then方法 then方法的返回结果是Proimse对象,对象状态由回调函数的执行结果方法决定
//1.如果回调函数中返回的结果是 非pormise 类型的属性,状态为成功,返回值为对象的成功的值
const result = p.then(value=>{
console.log(value);
//1.非 promise 类型的属性
return 'iloveyou';
//2.是 promise对象
return new Promise((resolve,reject)=>{
//resolve('ok');
reject('error');
})
//3.抛出错误
//throw new Error('出错了!');
throw '出错了';
},reason=>{
console.warn(reason);
})
//链式调用
p.then(value => {
},reason => {
}).then(value => {
},reason => {
})
Promise实践 读取多个文件
//引入fs模块
const fs = require('fs');
//调用方法读取文件
//fs.readFile('./resources/为学.md',(err,data1)=>{
//fs.readFile('./resources/插秧诗.md',(err,data2)=>{
//fs.readFile('./resources/观书有感.md',(err,data3)=>{
//let result = data1 + '\r\n' + data2 + '\r\n' + data3;
//console.log(result);
//})
//})
//})
//使用Promise实现
const p = new Promise(function(resolve,reject){
fs.readFile('./resources/为学.md',(err,data)=>{
resolve(data)
})
})
p.then(value=>{
return new Promise(function(resolve,reject){
fs.readFile('./resources/插秧诗.md',(err,data)=>{
resolve([value,data])
})
})
}).then(value=>{
return new Promise(function(resolve,reject){
fs.readFile('./resources/观书有感.md',(err,data)=>{
//压入
value.push(data);
resolve(value);
})
})
}).then(value=>{
console.log(value.join('\r\n'));
})
Promise.prototype.catch方法
const p = new Promise((resolve,reject)=>{
setTimeout(()=>{
//设置p对象的状态为失败,并设置失败的值
reject('出错了')
},1000)
})
p.then(value=>{},reason=>{
console.log(reason);
})
//catch语法糖
p.catch(reason){
console.log(reason);
})