下記のようなコードでTableauと呼ばれるオブジェクトをSetIntervalでリロードしています。  
ただしSetIntervalは定期的にリロード処理の完了、未完了に無関係に実行キューを吐いてしまいます。リロード処理が間に合わない場合更新がとまってしまいので、何かいい方法はないでしょうか？  
よろしくお願いします。

```

    <!DOCTYPE html>
    <html lang="en">
      <head>
      <title>Tableau JavaScript API</title>
      <script type="text/javascript" src="http://servername/javascripts/api/tableau_v8.js"></script>
      </head>
      <body>
      <div id="tableauViz"></div>
    
    <script type='text/javascript'>
    
    var placeholderDiv = document.getElementById("tableauViz");
    
      var url = "http://servername/t/311/views/Mayorscreenv5/MayorScreenv2";
    
      var options = {
        hideTabs: true,
        width: "100%",
        height: "1000px"
      };
    
      var viz = new tableauSoftware.Viz(placeholderDiv, url, options);
    
    setInterval(function () {viz.refreshDataAsync() }, 3000);
    
    </script>
    
    </body>
    </html>
    
```
CC BY-SA 4.0
2019-01-16T05:09:29.293
52005
2019-01-23T09:30:21.443
2019-01-16T05:39:47.673
3060
29098
question
javascript html
JavacriptのSetIntervalの処理について
**リロード処理の完了を待って一定時間後に再度リロード処理を行う** という趣旨のコードを記載します。

```

    ...
    
    // ここを書き換え
    // setInterval(function () {viz.refreshDataAsync() }, 3000);
    (function loop() {
        viz.refreshDataAsync()
            .then(() => setTimeout(loop, 3000))     // 処理完了から3秒後に再帰実行
            .catch(error => console.log(error));    // TODO: エラー時の処理
    })();
    
    ...
    
```

[MDN Web
Docs](https://developer.mozilla.org/ja/docs/Web/API/Window/setInterval#Ensure_that_execution_duration_is_shorter_than_interval_frequency)
ではコールバックの実行時間がインターバル時間よりも長くなるケースにおいて、再帰的な `setTimeout()` のパターンを推奨しています。

> ロジックの実行時間がインターバル時間より長くなる可能性がある場合は、WindowOrWorkerGlobalScope.setTimeout
> を使用して名前付き関数を再帰的に呼び出すことを推奨します。

また、[Tableauのドキュメント](https://onlinehelp.tableau.com/current/api/js_api/en-
us/JavaScriptAPI/js_api_concepts_asynchronous_calls.htm) によると、名前に `Async`
と付くメソッドは `Promise` を返すらしいので、  
`then()` メソッドのコールバックにて再帰呼び出しを行うことで、リロード処理の完了を待つことができます。  
ただし、この場合のリロード処理の実行間隔は、毎回のリロード処理の所要時間によってまちまちになります。
CC BY-SA 4.0
2019-01-23T09:30:21.443
52256
2019-01-23T09:30:21.443
31716
52005
answer