Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 不中断循环的节点函数_Javascript_Node.js - Fatal编程技术网

Javascript 不中断循环的节点函数

Javascript 不中断循环的节点函数,javascript,node.js,Javascript,Node.js,我正在做一个webdriverjs应用程序,我想检查jQuery何时在页面上完成。这里是我的方法,但它没有打破平衡时,其他人应该拿起它停止循环。循环没有停止。我想我做错了什么 isjQueryAjaxFinished: function(driver) { driver.exec('return window.jQuery != undefined && jQuery.active === 0', function(res) { console.log(res);

我正在做一个webdriverjs应用程序,我想检查jQuery何时在页面上完成。这里是我的方法,但它没有打破平衡时,其他人应该拿起它停止循环。循环没有停止。我想我做错了什么

isjQueryAjaxFinished: function(driver) {
  driver.exec('return window.jQuery != undefined && jQuery.active === 0', function(res) {
    console.log(res);
    return res;
  });
},

waitForjQueryAjaxToFinish: function(driver, reason) {
  maxTries = 30;

  for (i=0; i<maxTries; i++) {
    this.isjQueryAjaxFinished(driver, function(res) {
      if(res === false) {
        driver.sleep(1000).then(function() {
          console.log(reason + finished);
        });
      } else {
        return;
      }
    });
  }
}
isjqueryjaxfinished:函数(驱动程序){
driver.exec('return window.jQuery!=undefined&&jQuery.active==0',函数(res){
控制台日志(res);
返回res;
});
},
waitForjQueryAjaxToFinish:函数(驱动程序、原因){
最大值=30;

对于(i=0;iDriver.sleep是异步的。循环在睡眠调用期间继续。一旦在睡眠时调用回调,循环早就结束了。一种解决方案是使用递归(注意,最初调用函数时不需要为“i”提供值)。(免责声明:下面的代码未经测试……但您明白了。)

var max=30;
waitForjQueryAjaxToFinish:函数(驱动程序、原因、i){
var迭代=i | | 0;
_self=这个;
isjQueryAjaxFinished(驱动程序、函数(res)){
如果(res==false){
sleep(1000)。然后(function(){
控制台日志(原因);
if(迭代<最大值){
_self.waitForjQueryAjaxToFinish(驱动程序、原因、迭代+1);
}否则{
log(“抱歉…尝试了”+maxTries+“次,但仍然没有运气。”);
返回;
}
});
}否则{
返回;
}
});
}
}

这种方法的一个优点是它是非阻塞的。

我怀疑
.sleep()
是同步工作的,因此您的
for
循环会立即运行到完成,所有检查是否在1秒内完成的测试基本上都是同时进行的。因此,如果您的请求没有在1秒内完成,那么您永远看不到它完成。then将在driver@jrock2004是的,但是睡眠并没有停止上厕所p、 这就是为什么会有回调…应用程序会一直工作(包括for循环),直到回调被回调。显然,您不了解异步代码是如何工作的。您调用
.sleep()
并且它会立即返回,这允许
for
循环的所有其余部分立即运行,这样您就不会在不同的时间得到检查。所有检查都是从开始的一秒钟开始的。您必须从
中启动下一个检查。然后()
handler,以便对它们进行真正的排序,或者使用承诺将它们链接在一起以对它们进行排序。因此,它运行它,但它根本不休眠,只是退出,我在控制台日志中看到的所有内容都是假的,这是来自isjQueryAjaxFinishedok的,因此问题实际上是在isjQueryAjaxFinished中。我没有正确添加回调。Fi修正了它,现在它工作了
var maxTries = 30;

waitForjQueryAjaxToFinish: function(driver, reason, i) {
  var iteration = i || 0;
  _self = this;
    this.isjQueryAjaxFinished(driver, function(res) {
      if(res === false) {
        driver.sleep(1000).then(function() {
          console.log(reason);
          if(iteration < maxTries) {
             _self.waitForjQueryAjaxToFinish(driver, reason, iteration + 1);
          } else {
            console.log("Sorry...tried " + maxTries + "times but still no luck.");
             return;
          }
        });
      } else {
        return;
      }
    });
  }
}