Henry-Diasa / awesome_interview_question

总结前端面试题,更贴近于实战,而非背诵的八股文。
11 stars 0 forks source link

Promise.all和Promise.race的区别,应用场景 #481

Open xuechunLee opened 1 year ago

xuechunLee commented 1 year ago

Promise.all()可以将多个实例组装个成一个新实例,成功的时候返回一个成功的数组;失败的时候则返回最先被reject失败状态的值。 适用场景: 比如当一个页面需要在很多个模块的数据都返回回来时才正常显示,否则loading。

promise.all中的子任务是并发执行的,适用于前后没有依赖关系的。Promise.race()意为赛跑的意思,也就是数组中的任务哪个获取的块,就返回哪个,不管结果本身是成功还是失败。一般用于和定时器绑定,比如将一个请求和三秒的定时器包装成Promise实例,加入到Promise队列中,请求三秒中还没有回应时,给用户一些提示或相应的操作。

Henry-Diasa commented 1 year ago

两种方法的实现

static race(promises) {
        return new Promise((resolve, reject) => {
            for(let i = 0;i < promises.length;i++) {
                Promise.resolve(promises[i]).then(res => {
                    resolve(res) 
                }).catch(err => {
                    reject(err)
                })
            }
        })
    }

    static all(promises) {
        let result = [];
        let index = 0

        return new Promise((resolve, reject) => {
            for(let i = 0;i<promises.length;i++) {
                Promise.resolve(promises[i]).then(res => {
                    result[i] = res;
                    index++

                    if(index === promises.length) {
                        resolve(result)
                    }
                }).catch(err => {
                    reject(err)
                })
            }
        })
    }