[英]How can I return an array of promises in a then statement
所以在過去的幾個小時里,我一直在尋找異步的東西並使用promises。 我正在使用測試框架量角器,還有一些我遇到麻煩的異步問題。
在這個保存函數中,我異步調用cm.org1.all(),然后使用then來獲取響應。 我循環響應,我需要調用響應中的每個元素調用getNewElement(),它也有一個異步調用,所以每個元素都返回一個promise。
所以我有這一系列的承諾,但我不知道如何歸還它。 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
具有各種抽象和功能編程工具,涵蓋了大多數用例。
如果你使用repeater的.column()
你可以在一行中解決它:
this.save = function() {
cm.saveButton.click();
return cm.org1.all(by.repeater('brand in vm.brands').column('brand.alias')).getText();
};
我會這樣做,但是如果列brand.alias與我擁有的某個常量匹配,我希望最終能夠獲得元素的父級。 如果我只有別名文本,我無法得到父母,如果我錯了,請糾正我。
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
});
嘗試:
this.save = function() {
cm.saveButton.click();
var elements;
var promises = [];
var defer = protractor.promise.defer();
return 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));
}
return protractor.promise.all(promises);
});
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.