2017-02-06 8 views
0

Я хочу выйти из цикла для каждого цикла, как только текст включает ImageResizingOrg. Я мог бы легко сделать это, если бы он был синхронным. Поскольку javascript является асинхронным, мне нужно решить это. Любые решенияКак выйти из a для каждого цикла, если удовлетворяет внутреннему условию if, если его javascript, который является асинхронным по своей природе

organizationLocator.each(function(element) { 

      FunctionLibrary.getText(element, organizationName).then(function(text) { 
       logger.info(text); 
       if (text.includes('ImageResizingOrg')) { 

        FunctionLibrary.click(element, organizationName); 



       } 
      }) 

     }) 
+0

Вы пробовали перерыв; – Mazz

+0

break здесь не будет работать, поскольку это не обычный цикл, а анонимная функция обратного вызова, вызываемая каждым() для каждого экземпляра. Однако, 'return false ', должен делать трюк! – Connum

+1

Если 'FunctionLibrary.getText' является ASYNC, то вы уже будете в конце каждого –

ответ

-2

Вы можете сделать свой цикл «синхронным», передав каждый элемент в методе «затем».

Таким образом, вы можете остановить цикл, когда захотите.

var inc = 0, 
    doLoop = function (element) { 

     FunctionLibrary.getText(element, organizationName).then(function (text) { 
      logger.info(text); 

      inc += 1; 

      if (text.includes('ImageResizingOrg')) { 
       FunctionLibrary.click(element, organizationName); 
      } else if (inc < organizationLocator.length) { 
       doLoop(organizationLocator[inc]); 

      } 
     }); 

    }; 

doLoop(organizationLocator[inc]); 
1

Для решения проблемы с контуром используйте функцию filter. Предполагая, что ваш organizationLocator представляет собой массив элементов, вы можете сделать это:

organizationLocator.filter(function (elem, index) { 
    return elem.getText().then(function (text) { 
     return text.indexOf('ImageResizingOrg') > -1; 
    }); 
}).first().click();