我试图在不使用'然后'的情况下链接页面对象方法。每个方法都返回一个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;