Promise.all ialah alat yang berkuasa untuk melaksanakan berbilang operasi tak segerak dan agregat mereka secara serentak keputusan. Walau bagaimanapun, jika tidak digunakan dengan betul, ia boleh mengakibatkan tingkah laku yang tidak dijangka, seperti menyelesaikan dengan pelbagai nilai yang tidak ditentukan.
Pertimbangkan kod yang diberikan:
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); }); };
Di sini, fungsi addText mengembalikan Promise.semua nilai yang tidak ditentukan sebelum mana-mana janji individu dalam panggilan balik peta diselesaikan. Ini menyebabkan getQueries menyelesaikan dengan tatasusunan yang tidak ditentukan.
Untuk menyelesaikan selepas semua janji dipenuhi, kembalikan janji daripada setiap panggilan balik peta:
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); }); })); };
Ingat, Promise.all menerima pelbagai objek Promise. Nilai yang tidak ditentukan akan diselesaikan serta-merta, yang berpotensi menyebabkan penyelesaian pramatang. Sentiasa kembalikan janji daripada setiap operasi individu untuk memastikan susunan keputusan yang betul.
Atas ialah kandungan terperinci Mengapakah Promise.all Menyelesaikan dengan Nilai yang Tidak Ditakrifkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!