使用打字稿将 angular 网格列单元格文本与字符串数组进行比较

Compare angular grid column cell texts against a string array using typescript

我是 typescript 的新手,希望从 ag-grid 列中抓取值列表并将其与字符串数组进行比较。这是我为实现该目的而编写的函数。但是我的 ActualRatingsValues.push(text);似乎没有填充数组 ActualRatingsValues。我真的不明白承诺是如何运作的。这与承诺有关吗?

validateRatingsValues() {
   const ExpectedRatingsValues: Array<string> = ['A', 'B', 'C', 'D', 'E'];
   const ActualRatingsValues: Array<string> = [];
   const wrapper = element.all(by.css('.ag-pinned-left-cols-container div[col-id="name"]'))
            .getText()
            .then(text => {
                ActualRatingsValues.push(text);
            });

    let match = true;
    if (ExpectedRatingsValues != null && ActualRatingsValues != null) {
        if (ExpectedRatingsValues.length !== ActualRatingsValues.length) {
            match = false;

        } else {
            for (let i = 0; i < ActualRatingsValues.length; i++) {
                if (ActualRatingsValues[i].toString !== 
                    ExpectedRatingsValues[i].toString) {
                    match = false;
                    break;
                }
            }
        }
    } else {
        match = false;
    }

    expect(match).toBeTruthy();
}

我真的很惊讶你在尝试推送到 ActualRatingsValues 时没有收到错误消息,因为它是 const.

这里发生的是您的 getText() 调用之后的行实际上在返回所有承诺之前被执行。这就是为什么它似乎不起作用的原因。最简单的选择是实施 async/await。

这是它的样子:(请注意,我还稍微清理了代码)

async validateRatingsValues() {
    const ExpectedRatingsValues: Array<string> = ['A', 'B', 'C', 'D', 'E'];

    // this will wait for all the promises to be returned before proceeding
    const wrapper = await element.all(by.css('.ag-pinned-left-cols-container div[col-id="name"]'))
              .getText()

    wrapper.forEach(item => {
        expect(ExpectedRatingsValues.indexOf(item)).toBeGreaterThan(-1);

        // this should work too
        expect(ExpectedRatingsValues).toContain(item);
    }

    expect(wrapper.length).toEqual(ExpectedRatingsValues.length);
}

肯定有一些方法可以在不实施 async/await 的情况下实现这一目标。我尝试简单地创建一个示例,然后意识到我的示例不起作用。我建议阅读 Matt 在评论中发布的 question/answer 以便更好地理解。里面有很多有用的信息。

您的代码中有两个问题。

1) ActualRatingsValues.push(text) 应该是 ActualRatingsValues.concat(text)

因为 element.all().getText() return 最终值是 字符串数组 而不是 字符串 的承诺。

2) wrapper 是一个承诺,您在承诺中为 ActualRatingsValues 赋值。 为了消费 ActualRatingsValues,你必须在 promise then()

中消费它
validateRatingsValues() {
    const ExpectedRatingsValues: Array<string> = ['A', 'B', 'C', 'D', 'E'];
    const wrapper = element.all(by.css('.ag-pinned-left-cols-container div[col-id="name"]'))
            .getText();

    let match = wrapper.then(function(ActualRatingsValues) {
        let length = ExpectedRatingsValues.length;

        for(let i=0;i<length;i++) {
            let find = ActualRatingsValues.includes(ExpectedRatingsValues[i]);
            if (find === false) {
                return find;
            }           
        }

        return true;     
    });

    // match is also a promise which eventual value is a boolean
    // why below expect doesn't consume match inside then()
    // because Jasmine can detect match is a promise and do the assertion
    // inside then() in its implement internally.
    expect(match).toBeTruthy();
}