在守夜人中链接连续承诺

时间:2016-11-24 12:17:31

标签: javascript promise q chaining nightwatch.js

我试图在不使用'然后'的情况下链接页面对象方法。每个方法都返回一个promise。

此问题以前被标记为this one的副本,但我在Nightwatch中遇到了非常具体的问题。

已经尝试来实施this解决方案,但是如果在Page的方法之前调用了OtherPage的方法,它就会中断测试 - 页面&#39}在执行OtherPage的方法之前立即调用方法。我还尝试了 other提出的解决方案,但没有解决方案。

这是我的页面对象(pg.js)

var Q = require('q');
module.export = {
    elements: {
        someElement: {
            selector: '<h3>'
        }
    },
    commands: [{
        method1: function() {
            var defered = Q.defered();
            setTimeout(function() {
                defered.resolve();
            }, 1000);
            return defered.promise;
        },
        method2: function() {
            var defered = Q.defered();
            setTimeout(function() {
                defered.resolve();
            }, 1000);
            return defered.promise;
        }
    }]
}

这是测试文件:

module.exports = {
    'Some Test': function (client) {
        var Page = client.page.pg();// methods returning promises
        var OtherPage = client.page.otherpage(); // regular methods

        OtherPage.someMethod();

        // this of course works
        Page
        .method1()
        .then(Page.method2);

        // I'd like to call it this way
        Page
        .method1()
        .method2();
    }
}

更新

在应用this solution时,我的页面对象(pg.js)已修改。就像上面提到的那样,它可以工作,但它的所有方法都是在OtherPage的方法之前执行的:

var PromiseChain = require('./promiseChain');
var promiseChain = new PromiseChain();
var Q = require('q');
module.export = {
    elements: {
        someElement: {
            selector: '<h3>'
        }
    },
    commands: [{
        method1: promiseChain.add(function(arg) {
            var defered = Q.defered();
            setTimeout(function() {
                defered.resolve();
            }, 1000);
            return defered.promise;
        }),
        method2: promiseChain.add(function() {
            var defered = Q.defered();
            setTimeout(function() {
                defered.resolve();
            }, 1000);
            return defered.promise;
        })
    }]
}

这里是promiseChain.js

var Q = require('q');
var PromiseChain = function () {
    var lastPromise = Q.resolve();

    this.add = function (method) {
        return function () {
            var args = Array.prototype.slice.call(arguments);
            lastPromise = lastPromise.then(function () {
                return method.apply(this, args.concat(Array.prototype.slice.call(arguments)));
            }.bind(this));
            return this;
        };
    };
};

module.exports = PromiseChain;

0 个答案:

没有答案