Я хочу разорвать цикл

#javascript #protractor

#javascript #транспортир

Вопрос:

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

   })
  

Я не могу использовать оператор break внутри promise. Если я использую оператор break вне promise, то он не выполняет блок if, который находится вне цикла for

Комментарии:

1. Попробуйте использовать return

2. это также не сработает, поскольку оно работает синхронно, когда цикл for не будет ждать выполнения promise

3. @priya сделайте ваше i значение больше 12 внутри if как i =13 . чтобы цикл закончился. Не уверен, что это правильный путь.

Ответ №1:

Используйте async / await для использования последовательных циклов вокруг обещаний:

 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:

Это происходит потому, что функции могут прерывать циклы, которые находятся в функции, а не вне функции.
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;
  }  

Ответ №3:

Вы не можете прервать цикл таким образом, потому что 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);