Kendalian Asynchronous dan Nilai Pulangan dalam JavaScript: Menyelesaikan Enigma
Dalam JavaScript, operasi tak segerak, seperti permintaan rangkaian atau pengendalian acara, selalunya menghadirkan cabaran apabila cuba mengembalikan keputusan mereka secara serentak. Satu situasi sedemikian ditunjukkan oleh fungsi jQuery berikut:
<code class="javascript">function trackPage() { var elqTracker = new jQuery.elq(459); elqTracker.pageTrack({ success: function() { elqTracker.getGUID(function(guid) { alert(guid); var returnValue = guid; // Attempt to assign the GUID to a variable }); } }); return returnValue; // Return the assigned variable }</code>
Dalam senario ini, matlamatnya adalah untuk mendapatkan nilai GUID secara tidak segerak dan mengembalikannya kepada pemanggil. Walau bagaimanapun, nilai pulangan berubah kekal tidak ditentukan, menjadikan pulangan segerak tidak berkesan.
Memahami Sifat Operasi Asynchronous
Inti isu terletak pada sifat tak segerak operasi getGUID. Operasi tak segerak memulakan dan meneruskan pelaksanaannya tanpa menyekat utas utama. Ini menunjukkan bahawa apabila penyataan pemulangan dalam trackPage dicapai, panggilan getGUID belum selesai dan keputusannya tidak tersedia.
Penyelesaian Menggunakan Fungsi dan Janji Panggilan Balik
Dua pendekatan utama menangani cabaran ini:
Memfaktorkan semula kod:
Menggunakan Yang Ditangguh penyelesaian objek, kod itu boleh difaktorkan semula seperti berikut:
<code class="javascript">function trackPage() { var elqTracker = new jQuery.elq(459); var dfd = $.Deferred(); elqTracker.pageTrack({ success: function() { elqTracker.getGUID(function(guid) { dfd.resolve(guid); // Resolve the Deferred object with the GUID }); } }); return dfd.promise(); // Return a promise that represents the result } // Example usage: trackPage().done(function(guid) { // Guid is now available as the parameter to the done callback alert("Got GUID: " + guid); });</code>
Kod yang difaktorkan semula ini menggunakan objek Tertunda untuk mewakili operasi tak segerak dan membenarkan kefleksibelan dalam melampirkan panggilan balik untuk mendapatkan semula keputusan apabila ia tersedia.
Atas ialah kandungan terperinci Bagaimanakah saya boleh mengembalikan hasil operasi tak segerak secara serentak dalam JavaScript?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!