《我对Promise的了解》

123 阅读2分钟
  • 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()方法的对象


  1.  resolve 和 reject 可以改成任何其他名字,不影响使用,但一般就叫这两个名字

  2.  resolve 和 reject 都只接受一个参数

  3.  resolve 和 reject 并不是 .then(succes, fail) 里面的 success 和 fail, 任务成功的时候resolve 会去调用 success,失败的时候reject 会去调用 fail