2016-12-08 2 views
1

У меня есть логика, как показано ниже,Возвращение обещание внутри цикл

getSpecificCell: function(tableObject, rowText, columnCss) { 
    var ele = element.all(by.repeater(tableObject)).count().then(function(count) { 
     for (var i = 0; i < count; i++) { 
     return element(by.repeater(tableObject).row(i)).getText().then(function(txt) { 
     if (txt.indexOf(rowText) !== -1) { 
      return element(by.repeater(tableObject).row(i)).element(by.css('[' + columnCss + ']')); 
     } 
     }); 
    } 
    }); 
    return ele; 
} 

Но она возвращается значение в самой первой итерации. Можно ли возвратить обещание в этом виде цикла или у нас есть какое-либо другое решение для этого?

+0

У вас есть несколько обещаний в вашем коде. Кого вы хотите вернуть? Если вы хотите совместить обещания, поместите их в массив и используйте функцию prom.all. См.: Http://stackoverflow.com/questions/24852126/is-there-a-way-to-resolve-multiple-promises-with-protractor – raichu

+0

Нужно вернуть обещание, которое находится внутри цикла for – Prabhu

+0

Я имею в виду, что у вас есть несколько обещаний в вашем цикле. Каждая итерация генерирует одно или два обещания. – raichu

ответ

2

Во-первых, вам не нужно использовать петли for с ElementArrayFinder. Вот для чего нужен метод each().

Во-вторых, вам не нужно петли вообще. Похоже, вы должны использовать filter(), чтобы получить ячейки таблицы, соответствующие вашей спецификации, хотя я не уверен, что именно вы пытаетесь выполнить.

var table = element.all(by.repeater(tableObject)); 
// list is an ElementArrayFinder of all elements that matched the filter 
var list = table.filter(function (elem) { 
    return elem.getText().then(function (text) { 
     return txt.indexOf(rowText) !== -1 
    }) 
}); 

// do something with list 
list.count().then(function (count) { 
    console.log(count); 
});