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