如何在 then 语句中返回一系列承诺

2024-01-09

因此,在过去的几个小时里,我一直在研究异步内容并使用 Promise。我正在使用测试框架量角器,并且有一些异步问题我遇到了麻烦。

在此保存函数中,我异步调用 cm.org1.all(),然后使用 then 获取响应。我循环响应,并且需要对响应中的每个元素调用 getNewElement() ,其中也有一个异步调用,因此每个元素都返回一个承诺。

所以我有这一系列的承诺,但我不知道如何回报它。 cm.save()的返回值为[]。我需要它是 ['foo',foo',foo',foo']

下面的代码不起作用,但这是我到目前为止所拥有的。

 var cm = companyManagement() {
    //whatever is initialized below is initialized up here

    this.save = function() {
        cm.saveButton.click(); 
        var elements;
        var promises = [];
        var defer = protractor.promise.defer();
        cm.org1.all(by.repeater('brand in vm.brands'))
        .then(function(response) {
            //elements is of length 4
            elements = response;
            for(var i=0; i<elements.length;i++) {
                promises.push(getNewElement(elements, i));
            }
            //defer.fulfill(promises); not correct?
        });
        return protractor.promise.all(promises); //not correct?
    };

    function getNewElement(elements, i) {
         var defer = protractor.promise.defer();
        var alias = elements[i].element(by.binding('brand.alias'));
        alias.getText().then(function(aliasText) {
            defer.fulfill('foo');
        });
        return defer.promise;
    }
}
    cm.save()
    .then(function(response){
       console.log("my new array is",response);
    });

在测试中手动处理量角器承诺通常是问题过于复杂的标志。Protractor拥有涵盖大多数用例的各种抽象和函数式编程工具。

如果您使用中继器,您只需一行即可解决它.column() http://angular.github.io/protractor/#/api?view=ProtractorBy.prototype.repeater:

this.save = function() {
    cm.saveButton.click(); 
    return cm.org1.all(by.repeater('brand in vm.brands').column('brand.alias')).getText();
};

我会这样做,但如果列brand.alias与我拥有的某个常量匹配,我希望最终能够获得该元素的父元素。如果我只有别名文本,我无法获取父级,如果我错了,请纠正我。

filter() http://angular.github.io/protractor/#/api?view=ElementArrayFinder.prototype.filter and map() http://angular.github.io/protractor/#/api?view=ElementArrayFinder.prototype.map救援:

cm.org1.all(by.repeater('brand in vm.brands').column('brand.alias')).filter(alias) {
    return alias.getText().then(function (aliasText) {
        return aliasText === "foo";
    });
}).map(function (alias) {
    return alias.element(by.xpath("..")).getText();  // getting the parent
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 then 语句中返回一系列承诺 的相关文章

随机推荐