浏览器中的Javascript同步循环

时间:2017-06-07 22:36:49

标签: javascript asynchronous greasemonkey synchronous

尝试使用Greasemonkey在浏览器中自动执行任务。

要求:加载一个网页,其中包含一个显示340多个结果中的15个的表格,其中包含按钮控件以查看下一页的结果,返回,结束等等。

  1. 收集前15个结果 - >得到了这个工作
  2. 点击'下一步'按钮 - >得到了这个工作
  3. 等待,直到该页面加载下一组结果 - > 不知道如何
  4. 重复操作直到下一个按钮被禁用 - >得到了这个工作
  5. 无法展示图片,因为它是一个企业应用程序。

    到目前为止,如果我使用setTimeouts循环,超时排队并在我想的同时执行。相反,要求是代码运行信息收集,单击下一步,等待,然后再次收集信息。

4 个答案:

答案 0 :(得分:0)

您可以尝试一个实用程序函数waitForKeyElement,一个greasemonkey实用程序脚本。它基本上是在做你以前想做的事情。它设置超时以连续检查是否加载了元素。执行它看起来像这样:

waitForKeyElements (
     "div.comments", 
     commentCallbackFunction
);

评论回调函数将是收集结果的函数。

这也有助于理解为什么循环中的setTimeout不起作用。 setTimeout不会阻止执行脚本来运行回调函数。它将要执行的函数排队,而不是作为第二个参数传入的时间。因此,循环运行非常快,而不是在3000ms, 6000ms, and 9000ms...进行函数调用,因为您可能会在3000ms, 3001ms, 3002ms处获得更接近函数调用的内容。

答案 1 :(得分:0)

您可以通过同步执行程序nsynjs执行与API调用,递归和超时顺序混合的任意JS逻辑:



function synchronousCode() {
    var i=0;
    while(true) {
      console.log("waiting 1 sec, iteration", i++);
      $('#myDiv').toggle();
      nsynWait(nsynjsCtx,1000);
    };
}

var ctx;
function btnStopClicked() {
    ctx.stop();
    ctx=null;
}

function btnStartClicked() {
    ctx=nsynjs.run(synchronousCode,{},function(){
			console.log("Synchronous Code done");
		});
}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<script src="https://rawgit.com/amaksr/nsynjs/master/nsynjs.js"></script>
<script src="https://rawgit.com/amaksr/nsynjs/master/wrappers/nsynWait.js"></script>
<body>
  <button id="buttonStart" onclick="btnStartClicked()">Start</button>
  <button id="buttonStop" onclick="btnStopClicked()">Stop</button>
  <div id="myDiv">Flashing div</div>
</body>
&#13;
&#13;
&#13;

点击此处查看更多示例:https://github.com/amaksr/nsynjs/tree/master/examples

答案 2 :(得分:0)

感谢大家,发现这篇文章是最好的答案 Synchronous setTimeout + Loop

这样加载页面,读取第一个值,单击下一个按钮,显示下一个结果并读取,直到最后一页。

再次感谢您的意见和建议

答案 3 :(得分:0)

您可以使用它

for(const elment of arrayElements) {
            await yourFunc(elment)
            await yourOtherFunc('somePatameter')
}