Rumah > Artikel > hujung hadapan web > Mengapakah Promise.all Menyelesaikan Secara Pramatang dengan Unsur Tidak Ditakrifkan?
Dalam aplikasi JavaScript, fungsi mengembalikan tatasusunan yang diisi dengan elemen yang tidak ditentukan apabila menggunakan Janji.semua. Isu ini timbul sebelum fungsi menyelesaikan operasinya. Berikut ialah fungsi bermasalah:
<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>
Fungsi addText dikenal pasti sebagai punca masalah:
<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>
Untuk membetulkan isu, anda mesti ingat untuk mengembalikan Promises dalam Promise.all's map callback:
<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>
Dengan menambahkan pernyataan pulangan yang hilang, anda kini dengan betul membungkus setiap panggilan pangkalan data dalam Promise dan mengembalikan Promise.all hasil apabila semua Promise individu mempunyai diselesaikan. Ini memastikan fungsi getQueries menerima hasil yang betul apabila semua pertanyaan diambil dan diproses.
Atas ialah kandungan terperinci Mengapakah Promise.all Menyelesaikan Secara Pramatang dengan Unsur Tidak Ditakrifkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!