How to handle protises promises inside a for loop?

I am trying to do some protractor testing, and promises are not allowed in the for loop.

In my test case, I want to find a specific node in the ng-repeat element.

Here is the code to find such a node:

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

Here is the console output:

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

The problem is that the getText () promise is resolved after the for loop completes. This is evidenced by the registered value of "i", which is equal to 23, the final score. I am looking for a way to make the for loop wait for a promise or another way to find node in general.

+4
source share
3 answers

, , - ​​ , getText().

, 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();
};

firstProfileNode() ElementFinder, node.

+2

.

promises asynch for for, node ( i 23)

, ( )

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

, node i closed in scope . .

0

- :

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);
0

Source: https://habr.com/ru/post/1673938/


All Articles