Promise是什么?
1、主要用于异步计算
2、可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果
3、可以在对象之间传递和操作promise,帮助我们处理队列
为什么会有Promise?
同步:一个任务执行完毕才会执行下一个任务
异步:可以将A任务交付给系统,继续做下一个任务 再通过回调函数 继续做A剩余任务, AB工作的顺序 和 时间顺序无关 所以叫“异步”。
Promise的作用:
1,主要是用来解决回调嵌套(执行完后再去执行某一些操作,这时候容易形成嵌套再嵌套的问题)的问题,也就是常见的"回调地狱";
2,执行多并发请求获取数据;
Promise的使用:
(1)使用new实例化一个Promise对象,Promise的构造函数中传递一个参数。这个参数是一个函数,该函数用于处理异步任务。
(2)并且传入两个参数:resolve和reject,分别表示异步执行成功后的回调函数和异步执行失败后的回调函数;
(3)通过 promise.then() 处理返回结果。这里的 p 指的是 Promise实例。
// 第一步:model层的接口封装
const promise = new Promise((resolve, reject) => {
// 这里做异步任务(比如ajax 请求接口。这里暂时用定时器代替)
setTimeout(function () {
var data = { retCode: 0, msg: 'hello' }; // 接口返回的数据
if (data.retCode == 0) {
// 接口请求成功时调用
resolve(data);
} else {
// 接口请求失败时调用
reject({ retCode: -1, msg: 'network error' });
}
}, 100);
});
// 第二步:业务层的接口调用。这里的 data 就是 从 resolve 和 reject 传过来的,也就是从接口拿到的数据
promise.then(data => {
// 从 resolve 获取正常结果
console.log(data);
}).catch(data => {
// 从 reject 获取异常结果
console.log(data);
promise对象的3个状态
初始化状态(等待状态):pending
成功状态:fullfilled
失败状态:rejected
promise 的基本用法
let promise = new Promise((resolve, reject) => {
resolve()
}).then(res => { console.log(res) })//undefined
Promise构造函数接收一共函数作为参数,该函数有两个参数分别为resolve和reject,调用resolve则会代表成功,调用reject则会代表失败。
then 方法
function greet() {
let promise = new Promise((resolve, reject) => {
let data = 'hello world'
resolve(data)
})
return promise
} greet().then(res => { console.log(res) })//hello world
then方法是处理resolve和reject的回调,分别有两个参数,参数分别是(resolve)=>{},(reject)=>{}。then方法的返回值也是一个promise,因此可以不断的进行链式调用then方法。
all方法
Promise的all方法提供了并行执行异步操作的能力,它可以将promise数组作为参数,只有当时所有promise都成功后,才会获取到成功结果,否则会报错。
function p1() {
var promise1 = new Promise(function (resolve, reject) {
console.log("p1的第一条输出语句");
resolve("p1完成");
})
return promise1;
}
function p2() {
var promise2 = new Promise(function (resolve, reject) {
console.log("p2的第一条输出语句");
resolve("p2完成");
})
return promise2;
}
function p3() {
var promise3 = new Promise(function (resolve, reject) {
console.log("p3的第一条输出语句");
resolve("p3完成")
});
return promise3;
}
Promise.all([p1(), p2(), p3()]).then(function (data) {
console.log(data);
})
打印结果:
p1的第一条输出语句
p2的第一条输出语句
p3的第一条输出语句
['p1完成','p2完成','p3完成']
race方法
在all中的回调函数中,等到所有的Promise都执行完,再来执行回调函数,race则不同它等到第一个Promise改变状态就开始执行回调函数。
let P1 = new Promise(resolve => {
setInterval(() => {
resolve("I\'m P1");
}, 1000)
});
let P2 = new Promise(resolve => {
setInterval(() => {
resolve("I\'m P2");
}, 1500)
});
Promise.race([P1, P2])
.then(value => {
console.log(value)
})
console.log('value')//value 与Promise是一起执行的,没有时间先后顺序