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

정의되지 않은 요소로 인해 Promise.all이 조기에 해결되는 이유는 무엇입니까?

DDD
DDD원래의
2024-10-30 07:40:17401검색

Why Does Promise.all Resolve Prematurely with Undefined Elements?

Promise.all이 정의되지 않은 요소로 조기에 해결

문제 설명

JavaScript 애플리케이션에서 함수는 다음과 같은 경우 정의되지 않은 요소로 채워진 배열을 반환합니다. Promise.all을 사용합니다. 이 문제는 함수가 작업을 완료하기 전에 발생합니다. 문제가 있는 함수는 다음과 같습니다.

<code class="js">classMethods.getQueries = function(models, dbId, dateStart, dateEnd) {
  return new Promise(function(resolve, reject) {
    // Fetch database.
    .then(extractQueries, reject)
      .then(sortQueries, reject)
      .then(onlyTen, reject)
      .then(addText, reject)
      .then(function(queries) {
        console.log("getQueries finished", queries); // Array of 10× undefined!
        resolve(queries);
      }, reject);

    // Functions here.
  });
};</code>

addText 함수가 문제의 근본 원인으로 식별됩니다.

<code class="js">function addText(queries) {
  // This line is missing the `return` keyword.
  Promise.all(queries.map(function(query) {
    models.queries.findById(query.queryId, {
      raw: true,
      attributes: [ "query" ]
    })
      .then(function(queryFetched) {
        query.text = queryFetched.query;
        console.log(query);
        
        // Here, missing the `return` keyword in front of `Promise.resolve(query)`.
        return Promise.resolve(query);
      }, function(error) {
        // Missing `return Promise.reject(error);`
      });
  }));
};</code>

해결 방법

문제를 해결하려면 다음을 수행해야 합니다. Promise.all의 맵 콜백에서 Promise를 반환하는 것을 기억하세요.

<code class="js">function addText(queries) {
  return Promise.all(queries.map(function(query) {
    // Add `return` here to fix the problem.
    return models.queries
      .findById(query.queryId, {
        raw: true,
        attributes: [ "query" ]
      })
      .then(function(queryFetched) {
        query.text = queryFetched.query;
        console.log(query);
        
        // Add `return` here.
        return Promise.resolve(query);
      }, function(error) {
        // Add `return` here.
        return Promise.reject(error);
      });
  }));
};</code>

누락된 반환 문을 추가하면 이제 각 데이터베이스 호출을 Promise로 적절하게 래핑하고 모든 개별 Promise가 다음과 같은 경우 Promise.all 결과를 반환할 수 있습니다. 해결되었습니다. 이렇게 하면 모든 쿼리를 가져와 처리할 때 getQueries 함수가 올바른 결과를 수신할 수 있습니다.

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

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