Bagaimana untuk mengembalikan pemerhati daripada fungsi global dalam Vue 2
P粉682987577
2023-09-05 22:03:02
<p>Helo, saya ada soalan: Dalam main.js, saya mempunyai fungsi global <code>getSites</code> </p><p>
Fungsi ini berfungsi menggunakan async/menunggu dan mengembalikan data tapak secara tidak segerak. </p><p>
Saya juga mempunyai pembolehubah global yang dipanggil <code>lockSitesLoading</code> yang saya tetapkan kepada benar apabila saya mula mendapat data daripada API, saya memerlukan pembolehubah ini untuk menghalang pelanggan daripada membuat permintaan baharu kepada pelayan. </p><p>
Dalam fungsi pertama <code>getSites</code>, saya perlu menyemak pembolehubah ini <code>lockSitesLoading</code> dan jika ia benar, mula memantaunya sehingga ia berubah kepada palsu. Pada ketika ini, saya ingin memanggil <code>getSites</code> </p><p>
Masalahnya bermula sekarang kerana apabila saya mula menonton pembolehubah, fungsi tidak menunggu pembolehubah menjadi palsu, tetapi mengembalikan <kod>undefined</code>. </p><p>
Berikut ialah kod saya: </p>
<p>Component.vue:</p>
<pre class="brush:php;toolbar:false;">async mounted() {
biarkan vm = ini;
tapak const = menunggu vm.getSites();
vm.sites = tapak.data
},</pre>
<p>main.js:</p>
<pre class="brush:php;toolbar:false;">async getSites() {
biarkan vm = ini;
if (vm.$store.state.lockSitesLoading) {
vm.$watch('$store.state.lockSitesLoading', () => vm.getSites());
} lain {
kembalikan vm._getSitesOnline();
//Ini adalah fungsi yang sebenarnya mendapat data daripada pelayan
}</pre>
<p>Saya cuba menyelesaikannya dengan cara ini tetapi ia tidak berjaya. Ada idea? </p>
Saya tidak tahu sama ada anda telah menyediakannya
lockSitesLoading = true
, dan saya tidak tahu di mana anda telah menyediakannya.Berikut ialah contoh yang berkesan.
Pada asasnya memerlukan janji untuk menunggu:
Sila ambil perhatian bahawa jika
lockSitesLoading
menyekat pelaksanaan atas sebab tertentu, ini akan menyebabkan kebocoran ingatan.Mungkin terdapat cara yang lebih bersih untuk mencapai ini menggunakan komposisi API dan VueUse.