1.是什么?
promise就是一种构造函数
作用(为什么要有它):解决一些异步编程问题 用来封装异步操作并可以获取异步操作成功或失败的结果
异步编程 异步模式:每一个任务有一个或多个回调函数,前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务不等前一个任务结束就执行
(所以实现了程序执行顺序和代码的排列顺序是不一致的,也就是异步的)
比如现在要实现f1函数执行后执行f2 则可以把f2作为f1的回调函数
2.使用
实例化Promise对象
Promise()参数为一个函数 函数里面包装着异步操作 该函数的参数有两个:resolve和reject
在函数里面调用resolve 和 reject函数会改变该实例化对象的状态 前者会改变为成功 后者改变为失败调用Promise对象的then方法
参数为两个函数 当实例成功状态时调用第一个函数 失败则调用第二个函数 两个函数都有一个参数
可以接受实例化对象函数中的形参
3.应用
3.1读取文件信息
const p = new Promise(function(resolve,reject){
fs.readFile('文件相对地址',(err,data)=>{
if(err) return err;
resolve(data);
})
})
p.then(function(value){
console.log('It works');
},function(reason){
console.log('error!');
})
3.2promise封装AJAX
const p = new Promise(function(resolve,reject){
const xhr = new XMLHttpRequest();
//初始化
xhr.open('get' , 'https://api.apiopen.top/searchPoetry?name=古风二首%20二');
xhr.send();
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
if(xhr.status>= 200 && xhr.status <300){
console.log(xhr.response);
resolve(xhr.response)
}else{
reject(xhr.status);
console.log(xhr.status);
}
}
}
})
p.then(function(value){
console.log(value);
},function(reason){
console.log(reason);
})
3.3promise.prototype.then();
then()方法返回结果是promise对象 对象状态由then方法参数函数里面的返回值决定
1.返回值为非promise类型
该promise对象状态为成功 value为该返回值
var p = new Promise(function(resolve,reject){
setTimeout(() => {
var ch = 'work';
resolve(ch);
}, 1000);
})
var result = p.then(function(value){
console.log(value);
return 123;
},function(reason){
console.warn(reason);
})
console.log(result);//
2.返回值是promise对象
该promise对象状态取决于该返回值的promise对象的状态
value为返回值promise对象resolve或者reject传的值
3.抛出错误
状态为失败
value为抛出的值
链式then方法
p.then(reason=>{}).then(resolve=>{},reject=>{});
3.3.1案例实现
案例需求:读入三个文件内容 并将其进行拼接
不太理想的解决方式:
//引入 fs 模板
const fs = require("fs");
const { resolve } = require("path");
fs.readFile('文件路径1' ,(err,data1)=>{
fs.readFile("文件路径2",(err,data2)=>{
fs.readFile("文件路径3",(err,data3)=>{
let result = data1+data2+data3;
console.log(result);
})
})
})
使用链式then方法改进版:
const fs = require("fs");
const { resolve } = require("path");
var p = new Promise(function(resolve,reject){
fs.readFile('文件路径1',(err,data1)=>{
resolve(data1);
})
})
p.then(value=>{
return new Promise(){
fs.readFile("文件路径2",(err,data2)=>{
resolve([value,data2]);
})
}
}).then(value=>{
return new Promise(){
fs.readFile("文件路径3",(err,data3)=>{
value.push(data2);
resolve(value);
})
}
}).then(value=>{
console.log(value.join('\r\n'));
})
3.4 catch方法
相当于then方法不设置第一个参数
var p = new Promise(function(resolve,reject){
setTimeout(() => {
var ch = 'not work';
reject(ch);
}, 1000);
})
var result = var result = p.then(null,function(reason){
console.warn(reason);
})
//等价于:
p.catch(reason=>{
console.warn(reason);
})