【发布时间】:2017-10-22 08:17:26
【问题描述】:
所以...我有一些方法。每个方法都返回一个承诺。
myAsyncMethods: {
myNavigate () {
// Imagine this is returning a webdriverio promise
return new Promise(function(resolve){
setTimeout(resolve, 1000);
})
},
myClick () {
// Imagine this is returning a webdriverio promise
return new Promise(function(resolve){
setTimeout(resolve, 2000);
})
}
}
我正在尝试进行end to end 测试,因此prom 链必须是线性的(第一次单击、下一次导航等)
现在,我可以做到这一点......
makeItFluent(myAsyncMethods)
.myNavigate()
.myClick()
.then(() => myAsyncMethods.otherMethod())
.then(() => /*do other stuff*/ )
...带有 ES6 代理功能:
function makeItFluent (actions) {
let prom = Promise.resolve();
const builder = new Proxy(actions, {
get (target, propKey) {
const origMethod = target[propKey];
return function continueBuilding (...args) {
// keep chaining promises
prom = prom.then(() => (typeof origMethod === 'function') && origMethod(...args));
// return an augmented promise with proxied object
return Object.assign(prom, builder);
};
}
});
return builder;
};
但是,我不能做的事情是:
makeItFluent(myAsyncMethods)
.myNavigate()
.myClick()
.then(() => myAsyncMethods.otherMethod())
.then(() => /*do other stuff*/ )
.myNavigate()
因为then 不是代理方法,因此它不会返回myAsyncMethods。我尝试代理then,但没有结果。
有什么想法吗?
感谢开发者;)
【问题讨论】:
-
你真的不应该代理
then来装饰无论如何返回一个不承诺。如果每个人都这样做,对你的方法的引用就会随着每个 promise 结果泄露出去。 -
你的
makeItFluent东西不允许分支,它总是建立一个线性的prom链。避免命令式赋值。 -
Object.assign确实会破坏您的代理。 -
谢谢@Bergi,我知道这不是最好的方法。但我必须弄清楚这一点。
-
我在
makeItFluent中看不到分支的需要,你能解释一下吗?我只需要返回myAsyncMethods的代理,对吗? :s 每当调用一个方法时,它都会返回一个带有代理方法的承诺,因为当我执行这些东西时,我可以看到 getter 内部的痕迹。你让我感到困惑,因为它有效......也许我看不出你的意思
标签: javascript es6-promise fluent es6-proxy chainable