javascript - 停止 JavaScript 执行,直到 Promise 得到解决

标签 javascript angularjs node.js jasmine protractor

我有一个特定的用例,在测试代码中我想获取表头(异步),然后在 JavaScript 对象上动态创建 getter。我想在测试中使用的语法是 antenneTable.row(0).getAzimut();。我遇到的问题是 antenneTable.row(0); 返回一个 promise ,因此 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;

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


});

最佳答案

异步/等待

有一个名为 async/await 的库(受到 C# 版本 5 的启发)

这使得您的 promise 代码外观和感觉同步

例如

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

关于javascript - 停止 JavaScript 执行,直到 Promise 得到解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30934992/

相关文章:

javascript - 自定义 YouTube 控件、标题和整个 iFrame

javascript - 我可以将函数导入 typescript 类文件吗?

javascript - 单击 getElementsByClassName 和 where

javascript - 如何在 Angular JS 中以编程方式美化 JSON?

node.js - 尽管 maxSockets 高,Nodejs 出站 HTTP 请求还是延迟

node.js - EventEmitter 内存泄漏。需要 ('request' )

javascript - 预期参数的类型为 `array`,但收到的类型为 `string` - image-webpack-loader

javascript - DOM Mutation Observers 是否比 DOM Mutation Events 慢?

javascript - 在 Visual Studio Code 中使用装饰器时出错

node.js - 无法在Windows 7中安装 Electron 预构建