Vue 2 のグローバル関数からオブザーバーを返す方法
P粉682987577
2023-09-05 22:03:02
<p>こんにちは、質問があります。main.js には、API からサイトのリストを取得するグローバル関数 <code>getSites</code> があります。 </p><p>
この関数は async/await を使用して動作し、サイト データを非同期で返します。 </p><p>
また、<code>lockSitesLoading</code> というグローバル変数もあり、API からデータの取得を開始するときに true に設定します。クライアントがサーバーに新しいリクエストを行うのを防ぐためにこの変数が必要です。 </p><p>
最初の関数 <code>getSites</code> では、この変数 <code>lockSitesLoading</code> をチェックする必要があります。それが true の場合は、false に変わるまで監視を開始します。この時点で、<code>getSites</code> を再帰的に呼び出したいと思います。 </p><p>
変数の監視を開始すると、関数は変数が false になるのを待たずに、<code>unknown</code> を返すため、問題はここから始まります。 </p><p>
これが私のコードです: </p>
<p>Component.vue:</p>
<pre class="brush:php;toolbar:false;">async mount() {
vm = this; とします。
const sites = await vm.getSites();
vm.sites = サイト.データ
},</pre>
<p>main.js:</p>
<pre class="brush:php;toolbar:false;">async getSites() {
vm = this; とします。
if (vm.$store.state.lockSitesLoading) {
vm.$watch('$store.state.lockSitesLoading', () => vm.getSites());
} それ以外 {
return vm._getSitesOnline();
//実際にサーバーからデータを取得する関数です
}</pre>
<p>この方法で解決しようとしましたが、うまくいきません。何か案は? </p>
lockSitesLoading = true
を設定したかどうかも、どこで設定したかもわかりません。これは実際の例です。
基本的には待機する約束が必要です:
リーリー何らかの理由で
lockSitesLoading
が実行をブロックすると、メモリ リークが発生することに注意してください。これを実現するには、コンポジション API と VueUse コンポジションを使用するよりクリーンな方法があるかもしれません。