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 중국어 웹사이트의 기타 관련 기사를 참조하세요!