Javascript 每个循环未设置超出其范围的变量

Javascript 每个循环未设置超出其范围的变量,javascript,typescript,protractor,Javascript,Typescript,Protractor,我试图检查网页上某列的元素列表是否按降序排列。我有Java背景,所以我仍在试图弄清楚为什么这不起作用。据我所知,当isDescending达到最终预期值时,应该正确设置isDescending,但它与我初始化它时的设置不同 我已经把打印语句放在了循环中,在那里一切都很好 我做了一些挖掘,这可能与它在完成循环之前在底部运行expect有关,或者由于某种原因isDescending实际上没有正确设置有关 我尝试了许多方法,比如setTimeout和其他方法,但都没有解决这个问题 这是下面的代码,寻找

我试图检查网页上某列的元素列表是否按降序排列。我有Java背景,所以我仍在试图弄清楚为什么这不起作用。据我所知,当isDescending达到最终预期值时,应该正确设置isDescending,但它与我初始化它时的设置不同

我已经把打印语句放在了循环中,在那里一切都很好

我做了一些挖掘,这可能与它在完成循环之前在底部运行expect有关,或者由于某种原因isDescending实际上没有正确设置有关

我尝试了许多方法,比如setTimeout和其他方法,但都没有解决这个问题

这是下面的代码,寻找任何建议或链接到我可以研究更多的页面

    function checkIfDescending(){
        // Will hold list of webelements that each have one account number
        const accountNumbersDescending = pa_search.account_no_column_elements();
        let previousDescendingValue = '';
        let isDescending = true;
        accountNumbersDescending.each((accountNumberElement) => {
            accountNumberElement.getText().then((text) => {
                if (previousDescendingValue !== '') {
                    if (!(text >= previousDescendingValue)) {
                        isDescending = false;
                    }
                }
                previousDescendingValue = text;
            });
        });
        expect(isDescending).toBe(true);
    }

最后,如果我将expect放在if语句中,它将正常工作。问题是,如果早期出现故障,它将运行多次。

感谢Mark Schultheis为我提供了这个答案。 我不是100%的认为这是做事情的正确方式,但现在它可能通过了/失败了

    function checkIfDescending(){
        const accountNumbersDescending = pa_search.account_no_column_elements();
        let previousDescendingValue = '';
        let isDescending = true;
        accountNumbersDescending.each((accountNumberElement) => {
            accountNumberElement.getText().then((text) => {
                if (previousDescendingValue !== '') {
                    if (!(text >= previousDescendingValue)) {
                        isDescending = false;

                    }
                }
                previousDescendingValue = text;
            })
        }).then(() => {
            expect(isDescending).toBe(true);
        });
    }
你可以看看这个插件


您需要将值存储在数组或承诺中,并做出
expect
断言。

expect在您设置它之前运行,即使它在顺序中是优先的,但在执行顺序中不是。是的,这就是我在尝试了更多东西之后看到的。这就是为什么我去查看如何在javascript/typescript中修复这些类型的东西。到目前为止运气不好。您需要将
expect
放入某种事件处理程序中,在所有循环完成后执行,并以某种方式触发它。i、 e.承诺或类似的东西-避免
settimeout
,因为这只是表示在某些情况下会失败的代码-并且在阅读承诺后很难诊断,我相信我已经在使用“then”语法了。因此,基本上,事件处理程序只需在循环完成时触发。但是我遇到了同样的问题,如果我有办法知道循环什么时候完成,我就已经有了期望值?在
之后,然后在
每个
之外-因为每个实例都可能更改值。或者只触发一次,使用false和abort进一步循环…这是一个非常酷的插件。我会去看看并推荐它。将它们存储在阵列中将很容易。