暂停javascript执行,直到承诺得到解决

暂停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

我有一个特定的用例,在测试代码中,我希望获取一个表头(异步),然后在javascript对象上动态创建getter。我想在测试中使用的语法是
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');
})();