Promise.all 未定義の配列を返し、途中で解決する
Promise.all は、Promise オブジェクトの配列を受け入れ、すべての配列を一度解決するように設計されています。配列内の Promise が解決されました。ただし、提供されたコードでは、Promise.all のマップに渡されたコールバック関数が Promise を返さないために問題が発生します。
addText 関数内:
<code class="javascript">function addText(queries) { return Promise.all(queries.map(function(query) { // Missing `return` statement causes undefined values in the array models.queries .findById(query.queryId, { raw: true, attributes: [ "query" ] }) .then(function(queryFetched) { query.text = queryFetched.query; console.log(query); // Return the updated query as a resolved Promise return Promise.resolve(query); }, function(error) { // Return the error as a rejected Promise return Promise.reject(error); }); })); };</code>
何が起こっているかを次に示します。 :
この問題を修正し、コールバック内のすべての Promise が完了した後でのみ Promise.all が解決されるようにするには解決済みの場合、コールバックは明示的に Promises を返す必要があります:
<code class="javascript">function addText(queries) { return Promise.all(queries.map(function(query) { // Added `return` statement to wrap the Promise in the callback 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); }); })); };</code>
現在、マップ コールバックは Promises を返します。これは、Promise.all が適切に処理し、すべての Promise が解決された場合にのみ解決できます。
以上がPromise.all が未定義の配列を返し、途中で解決してしまうのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。