Promise

200 阅读2分钟

Promise

Promise是一种用于处理异步操作的对象。它代表了一个尚未完成但预计会在未来完成的操作,并提供了一种结构化的方式来处理操作的结果。

promise

创建

可以通过 new Promise(res,rej)来创建一个Promise对象。res和rej是两个可调用的函数,用于处理异步操作的结果

状态

Promise有三种不同的状态:pending(进行中),fulfilled(已成功)和rejected(已失败)。
初始状态为pending ,当异步操作完成后, Promise可以转为fulfilled或rejected状态。

处理结果

.then()方法来处理Promise的成功结果(fulfilled)。
.catch()方法处理Promise的失败状态(rejected)。
.finally()方法可以在Promise无论成功或失败后,都执行的操作。

案例:

const myPromise = new Promise((res,rej)=>{

            setTimeout(()=>{

                const num = Math.random();

                console.log(num)

                if(num>0.5){

                        res(num)

                    }else{

                        rej('Error')

                    }

            },1000)

        })

        myPromise.then(res=>{

            console.log('成功',res)

        }).catch(rej=>{

            console.log('失败',rej)

        }).finally(()=>{

            console.log('成功失败都会执行')

        })

0.8051994728705398.png

失败 Error.png

myPromise

        .then((res) => {

            console.log('成功', res);

            return res+1

        })

        .then((res) => {

            console.log('成功1', res);

        })

        .then((res) => {

            console.log('成功2', res); // undefined

        })

        .catch((rej) => {

            console.log('失败', rej);

        })

        .finally(() => {

            console.log('成功失败都会执行');

        });

如果想要使用.then传递参数,直接 return 返回参数就可以,如果没有return则为 undefined

Promise.all

接收一个Promise数组作为参数,并返回一个新的Promise。这个新的Promise在所有传入的Promise都解决(fulfilled)时解决,并提供一个包含所有Promise结果的数组。如果传入的任意一个Promise被拒绝(rejected),新的Promise将立即被拒绝,并返回第一个被拒绝的Promise的原因。

案例

const promise1 = new Promise((resolve) => {

  setTimeout(() => {

    resolve('Promise 1');

  }, 2000);

});

  


const promise2 = new Promise((resolve) => {

  setTimeout(() => {

    resolve('Promise 2');

  }, 1500);

});

  


const promise3 = new Promise((resolve, reject) => {

  setTimeout(() => {

    reject('Promise 3 has been rejected');

  }, 1000);

});

  


Promise.all([promise1, promise2])

  .then((results) => {

    console.log('所有Promise都已解决:', results);

  })

  .catch((error) => {

    console.log('至少一个Promise被拒绝:', error);

  });

  


Promise.all([promise1, promise2, promise3])

  .then((results) => {

    console.log('所有Promise都已解决:', results);

  })

  .catch((error) => {

    console.log('至少一个Promise被拒绝:', error);

  });

实际场景

通过调用后台接口,获取一个对象数组,再做判断,如果判断成立则循环调接口,获取接口返回参数,赋值,返回对象数组

const fetchbata async(url, parons)o(.png

erotooisCodeidata.erpfools(ode,.png

Promise.race()

接收一个Promise数组作为参数,并返回一个新的Promise。这个新的Promise将会在参数中的任意一个Promise解决或拒绝时,解决或拒绝,并提供第一个解决或拒绝的Promise的结果或原因。与Promise.all()不同,Promise.race()只要有一个Promise解决或拒绝,就会立即返回结果。

案例

const promise1 = new Promise((resolve) => {

  setTimeout(() => {

    resolve('Promise 1');

  }, 2000);

});

  


const promise2 = new Promise((resolve) => {

  setTimeout(() => {

    resolve('Promise 2');

  }, 1500);

});

  


const promise3 = new Promise((resolve, reject) => {

  setTimeout(() => {

    reject('Promise 3 has been rejected');

  }, 1000);

});

  


Promise.race([promise1, promise2, promise3])

  .then((result) => {

    console.log('第一个解决的Promise:', result);

  })

  .catch((error) => {

    console.log('第一个拒绝的Promise:', error);

  });