angularjs - Halt javascript execution until promise is resolved -
i have specific use case in test code want fetch tables headers (async) , dynamically create getters on javascript object. syntax use in test antennetable.row(0).getazimut();. problem having antennetable.row(0); returns promise , getazimut not yet defined on object.
i know how fix if use antennetable.row(0).then() keep syntax.
thanks in advance
this code :
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 =0 ; i< classes.length; ++){ var methodname = camelcase("get-"+classes[i]); (function(index) { outer[methodname] = function () { return row.all(by.tagname('td')).get(index).gettext(); } })(i); } }; module.exports = row; table.js
'use strict'; var row = require('./row.js'); var table = function (tableelement) { var headelement = tableelement.element(by.css('thead')); var bodyelement = tableelement.element(by.css('tbody')); this.row = function (index) { return headelement.all(by.css('th')).map(function (th) { return th.getattribute('class'); }).then(function (clazzes) { var rows = bodyelement.all(by.css('tr')); return new row(rows.get(index), clazzes); }) }; }; module.exports = table; 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 , 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/await
there's library called async/await (inspired c# version 5)
this makes promisable code look , feel synchronized
e.g.
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'); })(); - must hosted on nodejs environment
- awesome coding user experience
Comments
Post a Comment