>

다른 비동기 함수를 호출하는 비동기 함수가 있는데, 모두 완료되면 결과를 반환합니다.

Promise.all 를 사용하고 싶지 않습니다 이 기능 중 하나라도 실패하면 결과에 추가하지 않습니다.

ATM 코드는 다음과 같습니다. 그것은 작동하지만 나는 new Promise 를 좋아하지 않는다 , 나는 ES6 비동기 방식으로 그것을하고 싶다. 그래서 callAll 함수는 const callAll = async (query) => { 처럼 보일 것이다.

const callAll = (query) => {
    return new Promise((resolve, reject) => {
        const results = [];
        const jobs = [
            {
                promise: someModuleFirst.search(query), 
                done: false
            },
            {
                promise: someModuleSecond.search(query),
                done: false
            },
            {
                promise: someModuleThird.search(query),
                done: false    
            }
        ];
        const areAllDone = () => {
            if(!jobs.filter((job) => !job.done).length) {
                return true;
            }
        };
        jobs.forEach((job) => {
            job.promise.then((result) => {
                job.done = true;
                results.push(result);
                if(areAllDone()) {
                    resolve(results);
                }
            }).catch((error) => {
                job.done = true; 
                if(areAllDone()) {
                    resolve(results);
                }
            });
        });
    });
};

  • 답변 # 1

    코드를 다음과 같이 줄일 수 있습니다. 당신은 catch 에서 거짓을 반환 할 수 있습니다  처리기를 사용하여 데이터를 필터링하면 결과 집합으로 전달되지 않습니다.

    const callAll = async (query) => {
        const modules = [someModuleFirst, someModuleSecond, someModuleThird];
        const jobs = modules.map((module) => module.search(query).catch(() => false);
        const results = await Promise.all(jobs);
        return results.filter(Boolean);
    };
    
    

  • 답변 # 2

    Promise.all 를 사용할 수 있습니다  거부해야 할 사항을 캐시하고 해결하는 것만으로도 충분합니다.

    function someAsyncFunction() {
    	return new Promise((resolve, reject) => {
    		setTimeout(function () {
    			if (Math.round(Math.random() * 100) % 2) {
    				return resolve('some result');
    			}
    			reject('some rejection');
    		})
    	}, 1);
    }
    var promises = [];
    for (var i = 0; i < 10; i++) {
      // this is important part
      // catch block returns a promise with is resolved
      // so all promises now will resolve
    	promises.push(someAsyncFunction().catch(function (reason) {
    		return reason;
    	}));
    }
    Promise.all(promises).then(function (results) {
      console.log('All resolved');
    	console.log(results);
    }).catch(function (reason) {
    	console.error('Rejected');
    	console.log(reason);
    });
    
    

    귀하의 경우 someModuleFirst.search(query) 를 변경해야합니다.  이 someModuleFirst.search(query).catch(e => e) 와 같은 것에

관련 자료

  • 이전 big o - O 표기법, 결투 알고리즘
  • 다음 reactjs - 반응하여 테이블을 클릭 할 수있게하고 세부 사항을 편집하십시오