2017-04-04 4 views
4

Ich versuche, einige Winkelmesser Tests zu machen und Versprechungen werden nicht innerhalb der for-Schleife gelöst.Wie geht man mit Winkelmesserversprechen innerhalb einer for-Schleife um?

In meinem Testfall möchte ich einen bestimmten Knoten in einem ng-Repeat-Element finden.

Hier ist der Code einen solchen Knoten zu finden:

var firstProfileNode = function(nodename, profile){ 
    element.all(by.repeater('node in tree_nodes')).then(function(treeNodes){ 
     for(var i=0; i<treeNodes.length; i++){ 
      var node = treeNodes[i].element(by.css('.tree-dnd-handle')); 
      node.getText().then(function(text){ 

       console.log(i+" : "+text); 
       if (profile){ 
        var pattern = '^' +nodename+' \\(\\d+ devices\\)$'; 
        var regx = new RegExp(pattern); 
        if(regx.test(text)){ 
         console.log('found') 
         return node; 
        } 
       }else{ 
        if(text === nodename){ 
         return node; 
        } 
       } 
       }); 
     } 
    }); 
    }; 
var test = firstProfileNode('ISR', true); 

Hier ist die Ausgabe der Konsole:

23 : edison (4 devices) 
23 : ed21-mbr2 
23 : ed22-mbr1 
23 : ed22-mbr2 
23 : ed21-mbr1 
23 : c2800-12 
23 : L1 (4 devices) 
23 : c887VAM-1 
23 : c891-1 
23 : c887-1 
23 : c3850-1 
23 : ISR (3 devices) 
found 
23 : 3700 (2 devices) 
23 : c3745-2 
23 : c3745-1 
23 : c2921-1 
23 : c2800-11 
23 : N7K (3 devices) 
23 : n7k-2 
23 : n7k-1 
23 : n7k-3 
23 : c2800-13 
23 : c2800-14 

Das Problem ist, dass die getText() Versprechen löst nach der for-Schleife erfolgt . Der Beweis dafür ist der geloggte 'i'-Wert, der 23 ist, die endgültige Zählung. Ich bin auf der Suche nach einer Möglichkeit, die for-Schleife warten auf das Versprechen oder eine andere Möglichkeit, den Knoten insgesamt zu finden.

Antwort

2

Sie erwarten, dass der Code synchron von oben nach unten ausgeführt wird, aber er ist tatsächlich asynchron - die Schleife wäre in dem Moment vorbei, in dem zuerst getText() aufgelöst wird.

Ich denke, was Sie brauchen, ist ein filter():

var firstProfileNode = function(nodename, profile) { 
    return element.all(by.repeater('node in tree_nodes')).filter(function(treeNode) { 
     return treeNode.element(by.css('.tree-dnd-handle')).getText().then(function(text) { 
      if (profile) { 
       var pattern = '^' +nodename+' \\(\\d+ devices\\)$'; 
       var regx = new RegExp(pattern); 
       return regx.test(text); 
      } else { 
       return text === nodename; 
      } 
     }); 
    }).first(); 
}; 

Die firstProfileNode() Funktion eine ElementFinder Instanz auf die gewünschte gefilterte node Element entspricht zurückkehren würde.

+0

Da es sich um ein Testfall ich überprüfen müssen, dass die der Filter nicht eine 'ElementFinder' zurückkehrt, die nichts zeigt. Das hat für mich funktioniert: 'expect (test.isPresent()) .beBe (wahr);' – xsdf

0

Dies ist eine ziemlich häufige Erscheinung.

den Versprechungen Entschluß asynch nachdem die gesamte für die Schleife nur ausgeführt und deshalb wurde, wird der letzte Knoten (und i ist immer 23)

Ein gemeinsamer Ansatz den Rückruf zurückgeführt wird (dh)

einzuschließen
function fooBar(node, i) { 
     node.getText().then(function(text){ 
      console.log(i+" : "+text); 
      if (profile){ 
       var pattern = '^' +nodename+' \\(\\d+ devices\\)$'; 
       var regx = new RegExp(pattern); 
       if(regx.test(text)){ 
        console.log('found') 
        return node; 
       } 
      }else{ 
       if(text === nodename){ 
        return node; 
       } 
      } 
     });  
} 

In einer separaten Methode, so dass jede node und i Variable ist closed in scope in dieser Methode und ändert sich nicht. Dann rufen Sie einfach die Methode auf.

0

Sie können so etwas wie dies versuchen:

var firstProfileNode = function(nodename, profile){ 
    element.all(by.repeater('node in tree_nodes')).then(function(treeNodes){ 
     for(var i=0; i<treeNodes.length; i++){ 
      var node = treeNodes[i].element(by.css('.tree-dnd-handle')); 
      getNodeText(i, node); 
     } 
    }); 
    }; 

var getNodeText = function(i, node) { 
node.getText().then(function(text){ 

       console.log(i+" : "+text); 
       if (profile){ 
        var pattern = '^' +nodename+' \\(\\d+ devices\\)$'; 
        var regx = new RegExp(pattern); 
        if(regx.test(text)){ 
         console.log('found') 
         return node; 
        } 
       }else{ 
        if(text === nodename){ 
         return node; 
        } 
       } 
       });} 
var test = firstProfileNode('ISR', true); 
Verwandte Themen