Promise对象用于表示一个异步操作的最终完成(或失败)及其结果值。- Promise 是目前前端解决异步问题的统一方案 promise在js中主要是解决回调地狱 什么是回调地狱呢?回调地狱就是我们异步任务中嵌套异步任务太多层,导致我们的代码臃肿,而promise链式调用解决这种代码问题。从语法上讲,promise是一个对象,从它可以获取异步操作的消息;从本意上讲,它是承诺,承诺它过一段时间会给你一个结果。promise有三种状态: pending(等待态),fulfiled(成功态),rejected(失败态);状态一旦改变,就不会再变。创造promise实例后,它会立即执行。
如何创建一个 new Promise
let p = new Promise((resolve, reject) => {
//做一些异步操作
setTimeout(() => {
console.log('执行完成');
resolve('我是成功!!');
}, 2000);
});
Promise的构造函数接收一个参数:函数,并且这个函数需要传入两个参数:
-
resolve :异步操作执行成功后的回调函数
-
reject:异步操作执行失败后的回调函数
-
可以构成一个promise对象
如何使用 Promise.prototype.then
let p1 = new Promise((resolve, reject) => {
resolve('成功!');
// or
// reject(new Error("出错了!"));
});
p1.then(value => {
console.log(value); // 成功!
}, reason => {
console.error(reason); // 出错了!
});
如何使用 Promise.al
Promise.all 等待所有都完成(或第一个失败)。
let p1 = Promise.resolve(3);
let p2 = 1337;
let p3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
Promise.all([p1, p2, p3]).then(values => {
console.log(values); // [3, 1337, "foo"]
});
参考Promise.race() - JavaScript | MDN (mozilla.org)
如何使用 Promise.race
Promise.race(iterable) 方法返回一个 promise,一旦迭代器中的某个 promise 解决或拒绝,返回的 promise 就会解决或拒绝。
const promise1 = new Promise((resolve, reject) => {
setTimeout(resolve, 500, 'one');
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'two');
});
Promise.race([promise1, promise2]).then((value) => {
console.log(value);
// Both resolve, but promise2 is faster
});
// expected output: "two"
Promise解决回调地狱
回调地狱举例
getUser(user =>{
getGroups(user,(groups)=>{
groups.forEach((g)=>{
g.filter(x => x.ownerId === user.id)
.forEach(x => console.log(x))
})
})
})
这样几行代码就已经眼花了,如果嵌套的层级再多呢?我们的Promise就发挥作用了
getUser()
.then(getGroups)
.then(groups.forEach((g)=>{
g.filter(x => x.ownerId === user.id)
.forEach(x => console.log(x))
})
先改下调用的姿势
ajax('get','/xxx',{
success(response){},fail:(request,status)=>{}
})
上面用到了两个回调,还使用了 success 和 fail
- 改写Promise写法
ajax('get','/xxx')
.then((response)=>{},(request,status)=>{})
-
虽然也是回调
-
但是不需要记 success 和 fail 了
-
then 的第一个参数就是success
-
then 的第二个参数就是 fail
-
ajax返回一个含有.then()方法的对象
-
resolve 和 reject 可以改成任何其他名字,不影响使用,但一般就叫这两个名字
-
resolve 和 reject 都只接受一个参数
-
resolve 和 reject 并不是 .then(succes, fail) 里面的 success 和 fail, 任务成功的时候resolve 会去调用 success,失败的时候reject 会去调用 fail