问题描述
有这个简洁的功能来解析多个promises并将它们分散到不同的参数中:
如果你有一个数组的承诺,你可以使用spread作为替代。 扩展函数将值“扩展”到履行处理程序的参数上。
return getUsername()
.then(function (username) {
return [username, getUser(username)];
})
.spread(function (username, user) {
});
在量角器中,我们正在尝试使用来自WebDriverJS的内置 WebDriverJS 。
问题:
是否可以通过protractor.promise获得“传播”功能?
用例示例:
我们已经实现了一个自定义的jasmine matcher来 。
在这里,我们需要在进行相等比较之前解决两个promise。
目前,我们使用的是protractor.promise.all()和then() :
protractor.promise.all([
elm.getId(),
browser.driver.switchTo().activeElement().getId()
]).then(function (values) {
jasmine.matchersUtil.equals(values[0], values[1]);
});
理想情况下,我们希望处于更易读的状态:
protractor.promise.all([
elm.getId(),
browser.driver.switchTo().activeElement().getId()
]).spread(function (currentElementID, activeElementID) {
return jasmine.matchersUtil.equals(currentElementID, activeElementID);
})
1楼
使用它可能有点难看,但你可以定义一个独立的辅助函数,它可以作为参数传递给then()并有一个回调,通常传递给then()传递给它。
然后,此函数将数组值转换为函数参数:
protractor.promise.all([
elm.getId(),
browser.driver.switchTo().activeElement().getId()
]).then(spread(function (currentElementID, activeElementID) {
// ---^^^----- use helper function to spread args
jasmine.matchersUtil.equals(currentElementID, activeElementID);
}));
// helper function gets a callback
function spread(callback) {
// and returns a new function which will be used by `then()`
return function (array) {
// with a result of calling callback via apply to spread array values
return callback.apply(null, array);
};
}
您仍然可以使用另一个then()链接它并提供拒绝回调;
它保持Protractor承诺的所有行为相同,但只是将值数组转换为参数。
缺点是它没有你的例子中的完美外观(不是.all().spread()而是.all().then(spread()) )你可能不得不为此创建一个模块帮助或全局定义,以便能够在多个测试文件中轻松使用它。
更新:
使用ES2015,可以使用和then() :
protractor.promise.all([
elm.getId(),
browser.driver.switchTo().activeElement().getId()
]).then(function (values) {
// Destructure values to separate variables
const [currentElementID, activeElementID] = values;
jasmine.matchersUtil.equals(currentElementID, activeElementID);
}));
2楼
TL; DR显然,用q替换protractor.promise并不完全安全。
例如,一旦我决定扩展ElementArrayFinder ,我就有了一个悬挂测试运行:
老答案:
以下是我为解决这个问题所做的工作。
我已经用q替换了protractor.promise (不确定它是否真的安全):
onPrepare: {
protractor.promise = require("q");
},
但是,到目前为止没有任何事情发生,现在我可以通过protractor.promise使用spread()和q提供的其他语法糖:
toBeActive: function() {
return {
compare: function(elm) {
return {
pass: protractor.promise.all([
elm.getId(),
browser.driver.switchTo().activeElement().getId()
]).spread(function (currentElementID, activeElementID) {
return jasmine.matchersUtil.equals(currentElementID, activeElementID);
})
};
}
};
}
相关的github线程: 。