节点功能不会破坏循环

时间:2014-10-15 02:52:28

标签: javascript node.js

我正在做一个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;
      }
    });
  }
}

基本上我想要的是,如果isjQueryAjaxFinished返回假睡眠1秒钟,那么再试一次。如果它返回true,那么继续。就像我上面所说的那样,它只是保持循环,无论是真还是假,只是达到了for循环的极限。感谢

1 个答案:

答案 0 :(得分:2)

Driver.sleep是异步的。在睡眠呼叫期间循环继续。一旦在睡眠时调用回调,循环就已经很久了。一种解决方案是使用递归(注意,当您最初调用函数时,不需要为'i'提供值)。 (免责声明:未经测试的代码......但你明白了。)

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;
      }
    });
  }
}

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