Tengo una lógica como la de abajo,

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;
}

Pero está devolviendo el valor en la primera iteración. ¿Es posible devolver la promesa dentro de este tipo de bucle for o tenemos alguna otra solución para esto?

1
Prabhu 8 dic. 2016 a las 15:17
Tienes múltiples promesas en tu código. ¿A cuál quieres devolver? Si desea combinar las promesas, colóquelas en una matriz y use la función promise.all. Ver: stackoverflow.com/questions/24852126/…
 – 
raichu
8 dic. 2016 a las 15:33
Necesito devolver la promesa que está dentro del bucle for
 – 
Prabhu
8 dic. 2016 a las 15:37
Quiero decir que tienes múltiples promesas en tu bucle. Cada iteración genera una o dos promesas.
 – 
raichu
8 dic. 2016 a las 15:56
Lo siento, en realidad necesito devolver la promesa cuando se cumpla la if (txt.indexOf(rowText) !== -1) { Promesa que se devolverá: return element(by.repeater(tableObject).row(i)).element(by.css('[' + columnCss + ']'));
 – 
Prabhu
8 dic. 2016 a las 15:57
Lo siento, no entendí la intención de tu código. Supongo que intentas devolver una promesa solo cuando esa promesa se va a resolver. Pero no puedes hacer eso. Eso es lo que promete la naturaleza. Ocultan la asincronía, pero no debes olvidarlo. Para resolver su problema, verificaría cómo crear su propia promesa usando protractor.promise.defer(). Personalmente, tuve algunos problemas para entender las promesas al principio, así que si no sabes cómo usar defer (), pregúntame.
 – 
raichu
8 dic. 2016 a las 16:09

1 respuesta

La mejor respuesta

Primero, no necesitas usar bucles for con ElementArrayFinder. Para eso es el método each ().

En segundo lugar, no debería necesitar hacer un bucle en absoluto. Parece que debería utilizar filter () para obtener las celdas de la tabla que coinciden con su especificación, aunque no estoy seguro de qué es exactamente lo que está tratando de lograr.

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);
});
2
Gunderson 8 dic. 2016 a las 16:50