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 が解決される前に、未定義の値の 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 オブジェクトの配列を受け入れます。未定義の値はすぐに解決されるため、解決が早まる可能性があります。結果の配列が正しいことを保証するために、個々の操作から常に Promise を返します。
以上がPromise.all が未定義の値で解決されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。