[프론트엔드 면접 질문] Promise.all 메소드 작성(권장 모음)

[프론트엔드 인터뷰 질문] 프라미스 사용법(비동기 프로그래밍, 콜백 지옥) icon-default.png?t=LA92https://blog.csdn.net/weixin_46318413/article/details/122027650 ?

Promise.all() 메소드는 Promise의 반복 가능한 유형의 입력을 수신하고(참고: Array, Map 및 Set은 모두 ES6 반복 가능한 유형임), 단 하나 의 Promise 인스턴스와 그 안에 있는 모든 Promise의 resolve 콜백 결과를 반환합니다. 입력은 배열 입니다. Promise 의 resolve 콜백은 입력 프라미스의 모든 resolve 콜백 이 종료 되거나 입력 iterable에 더 이상 프라미스가 없을 때 실행됩니다 . 거부 콜백 실행은 입력 약속의 거부 콜백이 실행 되거나 입력 이 잘못된 경우 즉시 오류 가 발생 하고 거부가 처음 발생한 오류 메시지입니다.

MDN_Promise.all()https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/all https://developer.mozilla.org/zh-CN/docs/Web/ JavaScript/참조/Global_Objects/약속/모두

시나리오 1: 모든 입력 promise의 resolve 콜백 이 종료 되고 promise.all의 콜백이 출력될 수 있습니다.

//定义p1是在1秒后执行结果为{name: 'dai'}的promise的对象
let p1 = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve({
            name: 'dai'
        });
    }, 1000);
})
//定义p2是在2秒后执行结果为222的promise的对象
let p2 = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve(222);
    }, 2000);
})
//Promise.all() 方法接收一个promise的iterable类型,判断传入的每一个对象是否都成功并返回一个数组,否则会报错
//因为要等两个promise全部执行完才进行输出,由于p2需要两秒后执行,所以会在两秒后将两个执行结果一起输出
Promise.all([p1, p2]).then(res => {
    console.log(res);//输出为[{name:'dai'},222]
})

시나리오 2: 입력 약속의 거부 콜백이 실행되는 즉시 오류 발생 하고 처음 발생한 오류 메시지거부

//定义p1是在1秒后执行结果为{name: 'dai'}的promise的对象
let p1 = new Promise((resolve, reject) => {
    setTimeout(() => {
        reject(111);
    }, 1000);
})
//定义p2是在2秒后执行结果为222的promise的对象
let p2 = new Promise((resolve, reject) => {
    setTimeout(() => {
        reject(222);
    }, 2000);
})

Promise.all([p1, p2]).then((res) => {
    console.log(res)//报错输出111
})

Promise.all 함수를 손으로 작성하는 방법은 무엇입니까?

//定义p1是在1秒后执行结果为{name: 'dai'}的promise的对象
let p1 = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve({
            name: 'dai'
        });
    }, 1000);
})
//定义p2是在2秒后执行结果为222的promise的对象
let p2 = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve(222);
    }, 2000);
})

//手写一个promise.all
function myPromiseAll(lists) {
    return new Promise((resolve, reject) => {
        let resArr = [];//定义执行结果
        let n = 0;//判断是否全部
        lists.forEach(list => {
            list.then(item => {
                //把输入数组中的每一个promise的执行结果push到resArr中
                resArr.push(item);
                n++;
                //通过n判断是否执行结束
                if (n === lists.length) {
                    return resolve(resArr)
                }
            }, (reason) => {
                //如果遇到有一个reject,立马结束并输出第一个reject
                return reject(reason);
            })
        });
    })
}

//因为返回的是Promise对象,所以要通过then拿到执行结果
myPromiseAll([p1, p2]).then(res => {
    console.log(res)//输出[{name:'dai'},222]
})

위는 Promise.all의 메커니즘과 필기 방법입니다.

저는 CSDN 에서 일반적인 프로젝트의 일반적인 문제필기 시험 인터뷰 지식을 공유할 코더인 프론트 엔드 Dai 입니다. 모두가 함께 발전할 수 있기를 바랍니다.

추천

출처blog.csdn.net/weixin_46318413/article/details/122023908#comments_20499161