Sifat Asynchronous chrome.tabs.query: Mengapa Keputusan Kelihatan Tidak Tersedia Selepas Memanggil
Dalam membangunkan sambungan untuk Google Chrome, mendapatkan maklumat tab menggunakan chrome.tabs.query selalunya melibatkan penciptaan tatasusunan (formTabs) untuk menyimpan data tab dan kemudian mengakses kandungannya. Walau bagaimanapun, tingkah laku yang tidak dijangka boleh timbul apabila kod ini tidak dilaraskan dengan betul untuk sifat tak segerak chrome.tabs.query.
Pertimbangkan contoh berikut:
<code class="javascript">var fourmTabs = new Array(); chrome.tabs.query({}, function (tabs) { for (var i = 0; i < tabs.length; i++) { fourmTabs[i] = tabs[i]; } }); for (var i = 0; i < fourmTabs.length; i++) { if (fourmTabs[i] != null) window.console.log(fourmTabs[i].url); else { window.console.log("??" + i); } }</code>
Dalam contoh ini, kod cuba mencetak URL setiap tab dalam tatasusunan selepas panggilan balik chrome.tabs.query dilaksanakan. Walau bagaimanapun, apabila dijalankan tanpa titik putus, konsol kekal kosong, manakala menggunakan titik putus menghasilkan hasil yang dijangkakan.
Isu ini timbul kerana chrome.tabs.query ialah fungsi tak segerak, bermakna panggilan baliknya dilaksanakan secara berasingan daripada kod berikutnya . Apabila titik putus digunakan, pelaksanaan kod berhenti seketika pada titik putus pertama, membenarkan panggilan balik selesai sebelum gelung kedua dilaksanakan. Tanpa titik putus, gelung kedua dilaksanakan serta-merta selepas yang pertama, sebelum panggil balik chrome.tabs.query mempunyai masa untuk mengumpulkan data tab. Akibatnya, tatasusunan fourmTabs kosong apabila diakses dalam gelung kedua.
Untuk menyelesaikan isu ini dan memastikan kod beroperasi dengan betul, gelung kedua perlu dipindahkan ke dalam fungsi panggil balik chrome.tabs.query. Dengan cara ini, pelaksanaan gelung kedua dijamin berlaku hanya selepas data tab telah diambil:
<code class="javascript">chrome.tabs.query({}, function (tabs) { var fourmTabs = new Array(); for (var i = 0; i < tabs.length; i++) { fourmTabs[i] = tabs[i]; } for (var i = 0; i < fourmTabs.length; i++) { if (fourmTabs[i] != null) window.console.log(fourmTabs[i].url); else { window.console.log("??" + i); } } });</code>
Atas ialah kandungan terperinci Mengapa Keputusan `chrome.tabs.query` Saya Kelihatan Tidak Tersedia Selepas Memanggil?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!