初识Promise

171 阅读2分钟

什么是Promise?

Promise 是异步编程的一种解决方案:从语法上讲,promise是一个对象,从它可以获取异步操作的消息;从本意上讲,它是承诺,承诺它过一段时间会给你一个结果。promise有三种状态: pending(等待态),fulfiled(成功态),rejected(失败态) ;状态一旦改变,就不会再变。创造promise实例后,它会立即执行。

如何创建一个 new Promise和Promise.prototype.then使用

ajax = (method,url) =>{
    /*
    * 1.return new Promise((resolve,reject) = () =>{})
    * 2.任务成功就调用resolve,失败就调用reject
    * */
    return new Promise((resolve, reject) => {
        const request = new XMLHttpRequest()
        request.open(method,url)
        request.onreadystatechange = () =>{
            if (request.readyState === 4){
                if (request.status < 400){
                    //成功就调用resolve,失败就调用reject
                    resolve.call(null,request.response)
                }else if (request.status >= 400){
                    reject.call(null,request)
                }
            }
        }
        request.send()
    })
}
// then方法接受两个函数(注意是函数,不要直接调用函数,调用的函数会立即执行!!!!)
// **成功**的时候执行第一个函数,**失败**的时候执行第二个函数
ajax('GET','/XXXXX').then((response) =>{},(request) =>{})

如何使用 如何使用 Promise.all

all的用法:谁跑得慢以谁为执行回调。all接受一个数组参数,里面的值最终都返回Promise对象 Promise.all()方法提供了并行执行异步操作的能力,并且在所有异步操作执行完成后才执行回调

let Promise1 = new Promise((resolve, reject) => {})
let Promise2 = new Promise((resolve, reject) => {})
let Promise3 = new Promise((resolve, reject) => {})

let p = Promise.all([Promise1,Promise2,Promise3])

p.then(() =>{
    //三个都成功则成功
},() =>{
    //只要有一个失败则失败
})

如何使用 Promise.race

race的用法:谁跑的快,以谁为准执行回调 race使用场景:比如我们可以用race给某个异步请求设置超时时间,并在超时后执行相应的操作

/*requestImg函数会异步请求一张图片,我把地址写为"图片的路径",所以肯定是无法成功请求到的。
timeout函数是一个延时5秒的异步操作。我们把这两个返回Promise对象的函数放进race,
于是他俩就会赛跑,如果5秒之内图片请求成功了,那么遍进入then方法,执行正常的流程。
如果5秒钟图片还未成功返回,那么timeout就跑赢了,则进入catch,报出“图片请求超时”的信息*/
function requestImg () {
    let p = new Promise((resolve, reject) => {
        let img = new Image();
        img.onload = function (){
            resolve(img);
        }
        img.src = '图片路径'
    });
    return p
}
function timeout(){
    let p = new Promise((resolve, reject) => {
        setTimeout(() =>{
            reject('图片请求超时')
        },5000);
    });
    return p
}
Promise.race([requestImg(),timeout()]).then((data) =>{
    console.log(data);
}).catch((err) =>{
    console.log(err)
})