如何从量角器的承诺链中检索数据?

时间:2016-12-20 14:54:31

标签: javascript angularjs testing protractor

我有一个函数,它正确地检索元素的索引,文本==="检查"。它显然是在console.log中打印的:

function getIndex() {
    return element.all(by.css(".palette__item.ng-scope>span")).then(function (colorList) {
        colorList.forEach(function (elem, index) {
            elem.getText().then(function (text) {
                if (text == "check") {
                    console.log(index);
                    return index;
                }
            });
        });
    });
}

然后,我尝试了很多不同的方法,如何从中检索数据,但还没有成功。最后一种方法就是:

var res = null;
webDriver.promise.fullyResolved(getIndex()).then(function (index) {
    res = index;
});
console.log(res);

所以,在这里,我尝试在函数内部初始化res值,这可以保证任何promise解析,但它不起作用,并返回null。

我认为,我在getIndex()函数中有错误,也许,我已将return opertor放在错误的位置,但我需要帮助。我完全不知道如何让它发挥作用。求助。

3 个答案:

答案 0 :(得分:2)

您使问题过于复杂,请使用reduce(),而不是“forEach”:

function getIndex() {
    return element.all(by.css(".palette__item > span")).reduce(function (acc, elem, index) {
        return elem.getText().then(function (text) {
            if (text == "check") {
                return index;
            } 
        });
    }, -1);
}

用法:

getIndex().then(function (index) {
    console.log(index);
});

作为旁注 - 尽量不要在定位器中使用ng-scope类 - 它是一个纯粹的技术角度特定类,它不会给定位器带来意义。

答案 1 :(得分:1)

我目前无法调试它,但这应该可行:

function getIndex() {
    return element
            .all(by.css(".palette__item.ng-scope>span"))
            .then((colorList) => { 
              // get text for all elements
              return Promise.all( colorList.map( (el) = el.getText() ) ); 
            })
            .then((colorList) => {
              // we need both text and index
              return colorList.map( (el, ind) => [el, ind] )
              // but just the elements with text "check"
                              .filter( (elArr) => ellArr[0] == 'check' )
              // at this point we can throw away the text and just use the index
                              .map( (elArr) => elArr[1] );
            })
}

您的基本问题是,您将返回promises的函数与其他迭代器函数混合在一起。因此,当您最终调用return时,您完全失去了承诺上下文。

答案 2 :(得分:1)

一些事情: 对于初学者,您在promise之外初始化变量,但在promise中分配变量的值。这很好,但是看一下你向我们展示的例子中你的console.log()。如果你将console.log语句保留在最底部,那么它将在你的promise解析之前执行,因此变量res的值将为null。

您是否尝试在承诺中注销res的值?

回到getIndex函数...为什么在forEach函数中使用promises?您是否尝试过以下操作:

function getIndex() { return element.all(by.css(".palette__item.ng-scope>span")).then(function (colorList) { colorList.forEach(function (elem, index) { var temp = elem.getText() if (temp == "check") { console.log(index); return index }); }); }); }

这就是我可以建议你在这篇文章中提供的大量信息。这样做的关键教训是更好地理解异步代码与同步代码的区别。