>웹 프론트엔드 >JS 튜토리얼 >Promise.all이 정의되지 않은 값으로 해결되는 이유는 무엇입니까?

Promise.all이 정의되지 않은 값으로 해결되는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-31 09:10:02433검색

Why Does Promise.all Resolve with Undefined Values?

Promise.all 조기 해결: 정의되지 않은 배열 방지

개요

Promise.all은 여러 비동기 작업을 동시에 실행하고 해당 작업을 집계하는 강력한 도구입니다. 결과. 그러나 올바르게 사용하지 않으면 정의되지 않은 값의 배열로 해결하는 등 예상치 못한 동작이 발생할 수 있습니다.

문제

주어진 코드를 고려하세요.

classMethods.getQueries = function(models, dbId, dateStart, dateEnd) {
  return new Promise(function(resolve, reject) {
    ...
    then(addText, reject)
      .then(function(queries) {
        console.log("getQueries finished", queries); // Array of 10× undefined!
        resolve(queries);
      }, reject);
  });
};

여기서 addText 함수는 지도 콜백의 개별 약속이 해결되기 전에 정의되지 않은 값의 Promise.all을 반환합니다. 이로 인해 getQueries가 정의되지 않은 배열로 해결됩니다.

해결책

모든 Promise가 이행된 후 해결하려면 각 맵 콜백에서 Promise를 반환하세요.

function addText(queries) {
  return Promise.all(queries.map(function(query) {
    // Return the promise to delay resolution until the operation succeeds/fails.
    return models.queries
      .findById(query.queryId, {
        raw: true,
        attributes: [ "query" ]
      })
      .then(function(queryFetched) {
        query.text = queryFetched.query;
        console.log(query);
        
        return Promise.resolve(query);
      }, function(error) {
        return Promise.reject(error);
      });
  }));
};

피하기 Promise.all에서 정의되지 않음

Promise.all은 Promise 객체의 배열을 허용한다는 점을 기억하세요. 정의되지 않은 값은 즉시 해결되어 잠재적으로 조기 해결이 발생할 수 있습니다. 올바른 결과 배열을 보장하려면 항상 각 개별 작업에서 Promise를 반환하세요.

위 내용은 Promise.all이 정의되지 않은 값으로 해결되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.