q库具有此整齐的功能,可以解决多个promise并将其分散到单独的参数中:
q
如果对数组有保证,则可以使用点差代替。传播函数将值“传播”在实现处理程序的参数上。
return getUsername() .then(function (username) { return [username, getUser(username)]; }) .spread(function (username, user) { });
在量角器中,我们尝试使用来自的内置protractor.promise函数WebDriverJS。
protractor.promise
WebDriverJS
问题:
是否可以使用“传播”功能protractor.promise?
用例示例:
我们已经实现了一个自定义的茉莉花匹配器,以检查元素是否聚焦。在这里,在进行相等比较之前,我们需要解决两个诺言。目前,我们正在使用protractor.promise.all()和then():
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); })
使用它可能有点麻烦,但是您可以定义一个独立的帮助器函数,该函数可以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()并提供拒绝回调。它使量角器Promise的所有行为保持不变,只是将值数组转换为参数。
缺点是,它是没有一个完美的外观就像在你的榜样(未.all().spread()不过.all().then(spread())),你可能会需要创建这个助手模块或全局定义它能够在多个测试文件轻松地使用它。
.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); }));