暂停 javascript 执行,直到 promise 得到解决

Halt javascript execution until promise is resolved

我有一个特定的用例,在测试代码中我想获取表头(异步),然后在 javascript 对象上动态创建 getter。我想在测试中使用的语法是 antenneTable.row(0).getAzimut();。我遇到的问题是 antenneTable.row(0); returns 一个承诺,因此尚未在该对象上定义 getAzimut。

如果我使用 antennetable.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;

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 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);


});

解决方案可能不是 return 对象而是该对象的代理,并且仅在您承诺已解决时才解决您的方法。

你可以看看https://github.com/tvcutsem/harmony-reflect

Async/Await

这个库叫做 async/await灵感来自 C# 版本 5

这使您的承诺代码看起来和感觉同步

例如

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 环境中托管
  • 出色的编码用户体验