我想打破循环

时间:2019-04-23 13:18:48

标签: javascript protractor

home_page.activityOnAgenda().then(function (items) {
       var len = items.length;
       for ( i = 0; i<=12;i++ ) {
           browser.element(by.xpath("//virtual-list/div/div["+len+"]")).click();
           browser.sleep(3000);
           var flag = false;
          home_page.activity("My Scrolling").isPresent().then( function (value) {
          if(value===true){
              break;}
          })

       browser.element(by.xpath("//virtual-list/div/div["+len+"]")).click();

   })

我无法在promise中使用break语句。如果我在promise之外使用break语句,则如果for循环之外的block不会执行

3 个答案:

答案 0 :(得分:0)

您不能像这样中断循环,因为then回调最有可能仅在循环完成后才执行。如果您确实想使用此回调中断循环,则可以使用async/await

const items = await home_page.activityOnAgenda();
var len = items.length;
for (i = 0; i <= 12; i++) {
    browser.element(by.xpath("//virtual-list/div/div[" + len + "]")).click();
    browser.sleep(3000);
    var flag = false;
    const isPresent = await home_page.activity("My Scrolling").isPresent();
    if (isPresent) {
        break;
    }
    browser.element(by.xpath("//virtual-list/div/div[" + len + "]")).click();
}

此外,我不确定browser对象是什么,但我敢肯定它的sleep方法也是异步的,并且需要await

await browser.sleep(3000);

答案 1 :(得分:0)

使用async / await在promise周围使用顺序循环:

const items = await home_page.activityOnAgenda();
const len = items.length;
for (let i=0; i<=12; i++) {
    await browser.element(by.xpath("//virtual-list/div/div["+len+"]")).click();
    await browser.sleep(3000);
    if (await home_page.activity("My Scrolling").isPresent()) {
        break;
    }
}
await browser.element(by.xpath("//virtual-list/div/div["+len+"]")).click();

如果您不能使用该语法,请使用翻译器,或者使用递归方法,直到找到元素为止。

答案 2 :(得分:0)

之所以会发生这种情况,是因为函数会破坏函数内部而不是函数外部的循环。
then语句在完成承诺后执行该功能。
这是一个例子。

for (i = 0; i !== 10;i++){
  Promise.resolve(null).then(()=>{
    break
  })
}

这会导致错误

Uncaught SyntaxError: Illegal break statement

从该问题的其他答案中,您需要使用await
但是应该位于异步功能中。

有效的await

(async function() {
  for (i = 0; i !== 10; i++) {
    console.log(i)
    let resolved = await Promise.resolve(1)
    if (resolved === 1) break;
  }
})()

无效的await

  for (i = 0; i !== 10; i++) {
    console.log(i)
    let resolved = await Promise.resolve(1)
    if (resolved === 1) break;
  }