运行 在某个时间间隔内调用一个函数之后的函数?

Run function after a function called in an interval?

我在制作 Greasemonkey 脚本时发现了一个问题。网站有一个函数运行在一个区间:

jQuery(function1.run);
setInterval(function1.run, function1.interval);

我想在 function1.run 间隔结束后立即 运行 我的函数。我无法更改网站代码中的任何内容,因此我只能依靠我将添加的内容。

到目前为止,我尝试的所有操作都只调用了我的函数一次。

I would want to run my function right after function1.run interval is finished. I can't change anything in website code

可靠地做到这一点会很棘手。您可以将自己的函数设置为 also 运行 的间隔(通过将函数传递给 setInterval),如果您使间隔小于他们的间隔,你应该保证你的函数在调用他们的函数之间至少被调用一次(有时两次),但你不能确定它会 运行 立即 在他们之后.

一些想法:

  1. 只是让你的计时器间隔比他们的少一点;他们的功能 运行ning 和你的功能之间可能仍然存在重大延迟:

    例如(运行s,最长 30 秒):

// Their function: Once a second
var theirs = setInterval(function() {
  snippet.log("Theirs");
}, 1000);

// Your function: Once every 9/10ths of a second
var yours = setInterval(function() {
  snippet.log("Yours");
}, 900);

setTimeout(function() {
  snippet.log("Stopping");
  clearInterval(theirs);
  clearInterval(yours);
}, 30000);
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

  1. 如果他们函数的效果运行ning是可以在你的函数中测试的(所以你知道你的函数是否有自他们上次以来的 运行),你可以安排你的 运行 非常频繁但如果他们没有同时做任何事情 运行 .将函数的间隔设置为您愿意在他们的 运行 和您的之间传递的最长时间。

    示例:

var theyran = false;

// Their function: Once a second
var theirs = setInterval(function() {
  snippet.log("Theirs");
  theyran = true;
}, 1000);

// Your function: 20 times a second
var yours = setInterval(function() {
  if (theyran) {
    theyran = false;
    snippet.log("Yours");
  }
}, 50);

setTimeout(function() {
  snippet.log("Stopping");
  clearInterval(theirs);
  clearInterval(yours);
}, 30000);
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

  1. 如果他们的函数做了一些你可以得到通知的事情,你可以使用那个通知来调用你的函数.例如,在现代浏览器上,如果它以某种方式修改了 DOM,您可以使用 mutation observers 来接收该修改的通知(在稍旧的浏览器上,您可以使用库使用旧突变 events):

    模拟突变观察者

    示例:

// Their function: Once a second
var theirs = setInterval(function() {
  document.getElementById("content").innerHTML =
    "Theirs at " + new Date();
  snippet.log("Theirs");
}, 1000);

// Your function: Run by a mutation observer
var ob = new MutationObserver(function() {
  snippet.log("Yours");
});
ob.observe(document.getElementById("content"), {
  subtree: true,
  childList: true,
  characterData: true
});

setTimeout(function() {
  snippet.log("Stopping");
  clearInterval(theirs);
}, 30000);
<div id="content">
  In this scenario, their function modifies this div.
</div>
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>