Javascript 如何在for循环中处理量角器承诺?

Javascript 如何在for循环中处理量角器承诺?,javascript,angularjs,node.js,protractor,Javascript,Angularjs,Node.js,Protractor,我正在尝试做一些量角器测试,但是在for循环中没有解决承诺问题 在我的测试用例中,我想在ng repeat元素中找到一个特定的节点 以下是查找此类节点的代码: var firstProfileNode = function(nodename, profile){ element.all(by.repeater('node in tree_nodes')).then(function(treeNodes){ for(var i=0; i<treeNodes.leng

我正在尝试做一些量角器测试,但是在for循环中没有解决承诺问题

在我的测试用例中,我想在ng repeat元素中找到一个特定的节点

以下是查找此类节点的代码:

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

问题是,getText()承诺在for循环完成后解决。记录的“i”值(最终计数为23)可以看出这一点。我正在寻找一种让for循环等待承诺的方法,或者另一种找到节点的方法。

您希望代码从上到下同步执行,但它实际上是异步的-循环将在第一次解析
getText()
时结束

我认为您需要的是:


firstProfileNode()
函数将返回一个与所需过滤的
节点
元素相对应的实例。

这是一种非常常见的情况

在整个for循环运行之后,承诺解析异步,因此只返回最后一个节点(并且
i
始终为23)

一种常见的方法是将回调(即


在一个单独的方法中,使每个
节点
i
变量在该方法中的作用域是关闭的,并且不会改变。然后只需调用该方法。

您可以尝试以下方法:

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);
var firstProfileNode=函数(nodename,profile){
元素.all(通过.repeater('tree_nodes'))。然后(函数(treeNodes){

对于(var i=0;iSince)这是一个测试用例,我需要验证过滤器是否返回一个不指向任何内容的
ElementFinder
。这对我有用:
expect(test.isPresent()).toBe(true);
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();
};
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;
                }
            }
        });    
}
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);