暂停javascript执行,直到承诺得到解决
我有一个特定的用例,在测试代码中,我希望获取一个表头(异步),然后在javascript对象上动态创建getter。我想在测试中使用的语法是暂停javascript执行,直到承诺得到解决,javascript,angularjs,node.js,jasmine,protractor,Javascript,Angularjs,Node.js,Jasmine,Protractor,我有一个特定的用例,在测试代码中,我希望获取一个表头(异步),然后在javascript对象上动态创建getter。我想在测试中使用的语法是antenneTable.row(0).getAzimut()。我遇到的问题是antenneTable.row(0)返回一个承诺,因此尚未在该对象上定义getAzimut 如果我使用antenetable.row(0).then()的话,我知道如何修复它,但我希望保留语法 提前谢谢 这是我的代码: Row.js 'use strict'; var Row
antenneTable.row(0).getAzimut()代码>。我遇到的问题是antenneTable.row(0)代码>返回一个承诺,因此尚未在该对象上定义getAzimut
如果我使用antenetable.row(0).then()的话,我知道如何修复它,但我希望保留语法
提前谢谢
这是我的代码:
Row.js
'use strict';
var Row = function (row, classes) {
var outer = this;
function camelCase(input) {
return input.toLowerCase().replace(/-(.)/g, function(match, group1) {
return group1.toUpperCase();
})}
for(var i =0 ; i< classes.length; i ++){
var methodName = camelCase("get-"+classes[i]);
(function(index) {
outer[methodName] = function () {
return row.all(by.tagName('td')).get(index).getText();
}
})(i);
}
};
module.exports = Row;
MyTestClass.js
'use strict';
describe('dossier map', function(){
var mainPage = require('../../pages/mainpage.js');
var DossierDetailPage = require('../../pages/dossier/dossier-detail.js');
var Table = require('../../pages/table.js');
var dossierDetailPage = new DossierDetailPage();
afterEach(function() {
resetData();
mainPage.logout();
});
it('antenne details popup verschijnt', function() {
// TODO Activate test in Firefox and IE
if (!browser.isFirefox && !browser.isIE) {
mainPage.goTo('admin', 'admin');
mainPage.dossiers().byIndex(7).openDetail();
dossierDetailPage.zoomOut(5);
var popoverElement = element(by.css('#popover .popover'));
browser.driver.wait(function() {
return popoverElement.isPresent().then(function(isDisplayed){
if (isDisplayed) {
return true;
}
else {
dossierDetailPage.klikOpAntenneCluster(11);
return false;
}
});
});
var antenneTable = new Table(popoverElement.element(by.css('table')));
expect(antenneTable.row(0).getAzimut()).toBe('115');
}
}, 120000);
});
解决方案可以是不返回对象,而是返回此对象的代理,并且仅在已解析承诺时解析方法
您可以查看Async/wait
有一个名为的库(灵感来源于C#
version5)
这将使您的代码与的外观同步
例如
var Q = require("q");
var async = require('asyncawait/async');
var await = require('asyncawait/await');
function delay(millis) {
var deferred = Q.defer();
setTimeout(deferred.resolve, millis);
return deferred.promise;
}
async(function () {
console.log('message 1');
await(delay(100));
console.log('message 2');
})();
- 必须托管在NodeJS环境中
- 很棒的编码用户体验
如果您得到承诺,您可以将代码设置为在完成时发生。例如,见。在看到你已经知道的编辑之后;您无法在所描述的场景中保留当前语法。是的,如果使用then(),我知道如何修复它,但希望保留当前语法并使量角器以某种方式等待antenneTable。行(0)解析后不添加语法sugar@Arno_Geismar. 这是nodejs托管的脚本吗?本质上,等待承诺返回value@JossefHarush是的,它是一个以节点为主体的脚本。我们正在使用grunt运行端到端测试扫描您使用代理方法,即使这些方法事先不知道(它们是根据承诺返回的内容动态创建的),我将尝试这一方法并返回到you@Arno_Geismar; 伟大的我用过了,太棒了!我已经尝试过你的方法,但仍然得到相同的结果。你能为你尝试过的方法添加一个gist
/pastebin
吗?这样使用:你需要用自定义承诺包装你的功能
var Q = require("q");
var async = require('asyncawait/async');
var await = require('asyncawait/await');
function delay(millis) {
var deferred = Q.defer();
setTimeout(deferred.resolve, millis);
return deferred.promise;
}
async(function () {
console.log('message 1');
await(delay(100));
console.log('message 2');
})();