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 解析為未定義的陣列。
要在所有承諾完成後解析,請從每個映射回調返回承諾:
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.all 解析時會出現未定義的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!