2017-04-05 1 views
0

Ich habe den folgenden Hilfscode, von dem ich versuche, die Anzahl der Vorkommen einer Zeichenfolge zurückzugeben.Geben Sie einen Wert von forEach in Winkelmesser zurück - Verwalten von Schließungen

this.getActualFilteredStatusCount = function(strFilter){ 
    return this.getTotalRows().then(function(count){ 
     var totalCount = count; 
     var statusElementsObjs = $$(CommonElements.filterElement); 
     var occurence = 0; 
     var index = 0; 
     $$(CommonElements.filterElement).each(function(item){ 
      return item.getText().then(function(input){ 
       ++index; 
        if (input.indexOf(strFilter)>=0){ 
         ++occurence; 
         console.log(occurence);//this worked fine 
        } 
        if(index>=totalCount){ 
         return occurence; 
        } 
      });        
     }); 
    }); 
} 

Diese Funktion gibt nur undefined oder 0 zurück, aber nicht den richtigen Wert.

Ich habe viele Artikel über die Verwendung von Closures gelesen, aber konnte einfach nicht verstehen, dieses Problem zu lösen. Irgendwelche Vorschläge oder alternative Möglichkeiten, dies zu tun, wären hilfreich.

+1

Verwenden Sie 'Promise.map' anstelle von' .each' –

Antwort

0

Also, schließlich ist die Lösung für diese Verkettung von Ereignissen basierend auf Versprechungen durch die Aufnahme von Schließungen.

Ich beginne mit dem Erstellen eines leeren Versprechens. Von nun an kette ich die Ereignisse mit dem gleichen Versprechen, das in einer Schleife überschrieben wird. Schließlich warte ich einmal auf all die Versprechen, die ich für meine eigentliche Arbeit zu lösen habe!

this.getActualFilteredStatusCount = function(strFilter){ 
    return this.getTotalRows().then(function(count){ 
     var arrStatusTexts = []; 
     //creating an empty promise 
     var promiseKeeper = element.all(by.css(CommonElements.filterElement)); 
     return promiseKeeper. 
      then(function(elmsArr){ 
        for(idx=0;idx<elmsArr.length;idx++){ 
         //create a self executing function 
         (function (idx) { 
          promiseKeeper=promiseKeeper. 
           then(function(){ 
            return elmsArr[idx].getText(); 
            }). 
            then(function (statusText){ 
             //NOTE: the values here won't be in the same order everytime 
             arrStatusTexts.push(statusText); 
             }); 
          } 
         )(idx); 
        } 
        //executes after all the promises above get resolved to return the occurence 
        return promiseKeeper.then(function(){ 
          var occurence=0; 
          arrStatusTexts.forEach(function(el,index){ 
           if(el.indexOf(strFilter)>=0){ 
            ++occurence; 
           } 
          }); 
          return occurence; 
         }); 
       }); 
     }); 
    } 

Nicht sicher, ob dies der beste Weg ist! aber das ist alles, was ich jetzt habe

0

Ich denke, es kann sogar sauberer/kleiner sein. Soweit ich verstehe, haben Sie eine Tabelle mit viel Text, und Sie möchten nur zählen, wie oft die Zeichenfolge foo bar in der Tabelle gefunden wird?

|hello foo | hello bar | |goodbye foo bar | hello barry | |foofoo bar | bar foo |

Es hängt dann davon ab, wie die Tabelle aufgebaut ist, aber nehmen Sie zum Beispiel eine einfache Struktur wie table > tr > td haben, und Sie möchten überprüfen, wie oft die Zeichenfolge foo bar in den td ‚s gefunden wird, dann Sie können dies auch

element.all(by.cssContainingText('table tr td', 'foo')).count() 
    .then(function(amount){ 
    console.log('amount = ', amount); 
    }); 

tun Wenn Sie async/await verwenden es in 1 Zeile Code getan werden kann

const occurences = element.all(by.cssContainingText('table tr td', 'foo')).count(); 

Hoffe es hilft

+0

Ja, Ihr Verständnis ist richtig. Aber meins ist kein Tisch, sondern ein Div. Die Struktur ist etwas wie Tabelle-div -> row-div-> the-div-i-need. Ich werde dieses einfache auch versuchen –

Verwandte Themen