lodashデバウンスが機能しない(間違って使用していますか?)、関数が複数回呼び出されました

ココルダラカ

更新:自分で答えた。最後までスクロールします。

私の目的は単純です:

私はグーグルマップのキャンバスを持っています。ユーザーはマップをドラッグでき、プログラムはマップの中心付近のインシデントを自動的にダウンロードします(そしてマーカーを描画します)。

plugin.google.maps.event.CAMERA_CHANGEイベント用のこのリスナーがあります。重要なのは、このリスナーは複数回トリガーするということです。意味:キャンバスを指でタップしたときから->キャンバスをドラッグして->指を離したときまで...イベントは複数回トリガーされます。指を離したときだけではありません。どうやらそれはNミリ秒ごとにトリガーするウォッチャーを持っています。

これらの暫定的なcamera_changesの間に、サーバーからのコストのかかるデータのダウンロードとマーカーの描画をコードで実行したくありません。ユーザーがドラッグを停止した後でのみ実行したいと思います。つまり、5秒間に受信した最後のカメラ変更イベントで(最も遅いユーザーがキャンバスの隅から反対側の隅にドラッグするのに5秒かかることがわかりました)。

明らかに、私はこの必要性のためにデバウンスに目を向けます。しかし、それはうまくいかないようです。ログ(X1、X2)....から、関数が複数回呼び出されることがわかります(約3〜4回、キャンバス上をドラッグする速度によって異なります)。

確かに、彼らは私がドラッグをやめた後にのみ呼び出されます。しかし、それらは連続して呼び出されます。それらのすべての3-4。呼び出しの間に5秒の遅延があります。

それは私が期待したものではありません。また、.cancelメソッドに呼び出しを追加しました(これは不要だと思います...正しく理解していれば、デバウンスはすでにそれを処理しているはずです。タイムアウト内に中間呼び出しをキャンセルします)。

スロットルも試しました(概念的には答えではないと思います。デバウンスが答えになるはずです)。とにかく、スロットルと同じ問題。

だから、私の質問:私はどこで間違ったことをしましたか(lodashのデバウンスを使用する際に)?

ありがとう!

        var currentPosition = initialPosition();
        drawMarkersAroundCenter(map, currentPosition);

        var reactOnCameraChanged = function(camera) {
          console.log('X1');

          console.log('-----');
          console.log(JSON.stringify(camera.target));
          console.log(JSON.stringify(currentPosition));
          console.log('-----');

          if (camera.target.lat == currentPosition.lat && camera.target.lng == currentPosition.lng) {
            return;
          }

          currentPosition = camera.target;
          drawMarkersAroundCenter(map, currentPosition);
        }

        var debouncedReactOnCameraChange = lodash.debounce(reactOnCameraChanged, 5000, {
          'leading': false,
          'trailing': true
        });

        map.on(plugin.google.maps.event.CAMERA_CHANGE, function(camera) {
          debouncedReactOnCameraChange.cancel();
          debouncedReactOnCameraChange(camera);
        });

---更新---

nodejsコンソールでデバウンスを使用する非常に単純化されたシナリオを試しましたが、期待どおりに機能します。以下のコードでは.cancelも呼び出しません。では、上記のコードの何が問題になっていますか?下の画像では、この簡略化されたコードとの違いはわかりません。

ここに画像の説明を入力してください

更新

「reactOnCameraChanged」の代わりにこの男メソッドを試してみました:

        var dude = function(camera) {
          console.log('dude');
        }

        var debouncedReactOnCameraChange = lodash.debounce(dude, 5000, {
          'leading': false,
          'trailing': true
        });

また、.cancelへの呼び出しも削除しました。

        map.on(plugin.google.maps.event.CAMERA_CHANGE, function(camera) {
          //debouncedReactOnCameraChange.cancel();
          debouncedReactOnCameraChange(camera);
        });

'dude'がその5秒間に1回だけ出力されるのを見ることができます....だから..、reactOnCameraChanged内で行ったことが干渉を引き起こしています...どういうわけか....

解決済み:

以下の回答を参照してください。

ココルダラカ

このコードは機能します:

        var currentPosition = latLng;
        drawMarkersAroundCenter(map, currentPosition);

        var debouncedReactOnCameraChange = lodash.debounce(function(camera) {
          console.log('reactOnCameraChanged: ' + JSON.stringify(currentPosition));
          drawMarkersAroundCenter(map, currentPosition);
        }, 3000, {
          'leading': false,
          'trailing': true
        });

        map.on(plugin.google.maps.event.CAMERA_CHANGE, function(camera) {
          console.log('CAMERA_CHANGE');

          if (camera.target.lat == currentPosition.lat && camera.target.lng == currentPosition.lng) {
            console.log('same camera spot');
            return;
          }

          console.log('different camera spot');

          currentPosition = camera.target;
          debouncedReactOnCameraChange(camera);
        });

ここに画像の説明を入力してください

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

複数回呼び出されたときにJavascript関数が機能しない

分類Dev

期待される関数が呼び出されないのはなぜですか?型の特徴を間違って理解していますか?

分類Dev

メンバー関数呼び出しは、実装されていない機能をスローします

分類Dev

componentDidMountが呼び出されていない、まったく機能していないようです

分類Dev

PHPが静的変数を使用して再帰関数を複数回呼び出すと、誤ったデータが返されます

分類Dev

exeが別のmsvcrに静的にリンクしている場合、インポートされたDLL関数が間違った関数バージョンを呼び出す可能性がありますか?

分類Dev

モーダルポップアップが正しく機能しておらず、関数が複数回呼び出されています-クリックイベントハンドラーが数回実行されます

分類Dev

テンプレート補間を使用して関数が何度も呼び出されていますか?

分類Dev

関数が呼び出された変数参照を変更するのは間違っていますか?

分類Dev

Haskell関数が機能しません、何が間違っていますか?

分類Dev

XMLHttpRequestを使用して関数から呼び出された場合、関数は期待どおりに機能しますが、EventSourceを使用して関数から呼び出された場合は失敗します。どうしてこれなの?

分類Dev

JSは、関数を呼び出すか呼び出さないかによって異なる反応を示します(google maps apiが使用されます)

分類Dev

非同期関数は、1回呼び出されたときに機能しますが、複数回呼び出された場合は機能しません

分類Dev

Pythonで呼び出される関数のバージョンが間違っています

分類Dev

WindowsのJulia(0.6.2)から呼び出されたFortran関数の結果が間違っています

分類Dev

Swift:関数が間違った順序で呼び出されましたか?

分類Dev

間違ったBindingHandlerが呼び出されています

分類Dev

removeClassが機能しないのはなぜですか?何が間違ってコーディングされていますか?

分類Dev

カウンター値の関数変更を追加しましたが、UIに反映されていません。インデックスビューボタンから呼び出すと、なぜ追加されますか?anglejs

分類Dev

返されたが呼び出し元の関数によって割り当てられていない値の所有権はどうなりますか?

分類Dev

Tensorflow 2.0コードを実行すると、「ValueError:tf.function-decorated関数が最初の呼び出し以外で変数を作成しようとしました」が表示されます。私は何が間違っているのですか?

分類Dev

golangセッション変数が機能しない。私は間違って何をしていますか?

分類Dev

Rの関数呼び出しでデフォルトの引数が使用されているか、変更されているかをテストします

分類Dev

DLL関数呼び出しが機能していません

分類Dev

JavaScript呼び出し関数が機能していません

分類Dev

呼び出されたスクリプトが閉じたときに開いたままになっているブラウザウィンドウについて、Pythonデータを呼び出し元のスクリプトに戻す方法

分類Dev

AWS LambdaJava関数が複数回呼び出されました

分類Dev

関数をパラメーターとして呼び出す方法、これが機能しないようにしましたか?

分類Dev

WatchKitによって呼び出されたバックグラウンドで位置情報サービスが機能しない

Related 関連記事

  1. 1

    複数回呼び出されたときにJavascript関数が機能しない

  2. 2

    期待される関数が呼び出されないのはなぜですか?型の特徴を間違って理解していますか?

  3. 3

    メンバー関数呼び出しは、実装されていない機能をスローします

  4. 4

    componentDidMountが呼び出されていない、まったく機能していないようです

  5. 5

    PHPが静的変数を使用して再帰関数を複数回呼び出すと、誤ったデータが返されます

  6. 6

    exeが別のmsvcrに静的にリンクしている場合、インポートされたDLL関数が間違った関数バージョンを呼び出す可能性がありますか?

  7. 7

    モーダルポップアップが正しく機能しておらず、関数が複数回呼び出されています-クリックイベントハンドラーが数回実行されます

  8. 8

    テンプレート補間を使用して関数が何度も呼び出されていますか?

  9. 9

    関数が呼び出された変数参照を変更するのは間違っていますか?

  10. 10

    Haskell関数が機能しません、何が間違っていますか?

  11. 11

    XMLHttpRequestを使用して関数から呼び出された場合、関数は期待どおりに機能しますが、EventSourceを使用して関数から呼び出された場合は失敗します。どうしてこれなの?

  12. 12

    JSは、関数を呼び出すか呼び出さないかによって異なる反応を示します(google maps apiが使用されます)

  13. 13

    非同期関数は、1回呼び出されたときに機能しますが、複数回呼び出された場合は機能しません

  14. 14

    Pythonで呼び出される関数のバージョンが間違っています

  15. 15

    WindowsのJulia(0.6.2)から呼び出されたFortran関数の結果が間違っています

  16. 16

    Swift:関数が間違った順序で呼び出されましたか?

  17. 17

    間違ったBindingHandlerが呼び出されています

  18. 18

    removeClassが機能しないのはなぜですか?何が間違ってコーディングされていますか?

  19. 19

    カウンター値の関数変更を追加しましたが、UIに反映されていません。インデックスビューボタンから呼び出すと、なぜ追加されますか?anglejs

  20. 20

    返されたが呼び出し元の関数によって割り当てられていない値の所有権はどうなりますか?

  21. 21

    Tensorflow 2.0コードを実行すると、「ValueError:tf.function-decorated関数が最初の呼び出し以外で変数を作成しようとしました」が表示されます。私は何が間違っているのですか?

  22. 22

    golangセッション変数が機能しない。私は間違って何をしていますか?

  23. 23

    Rの関数呼び出しでデフォルトの引数が使用されているか、変更されているかをテストします

  24. 24

    DLL関数呼び出しが機能していません

  25. 25

    JavaScript呼び出し関数が機能していません

  26. 26

    呼び出されたスクリプトが閉じたときに開いたままになっているブラウザウィンドウについて、Pythonデータを呼び出し元のスクリプトに戻す方法

  27. 27

    AWS LambdaJava関数が複数回呼び出されました

  28. 28

    関数をパラメーターとして呼び出す方法、これが機能しないようにしましたか?

  29. 29

    WatchKitによって呼び出されたバックグラウンドで位置情報サービスが機能しない

ホットタグ

アーカイブ