【发布时间】:2019-01-09 03:33:56
【问题描述】:
假设我有一个类 Test 大约有 10-20 个方法,所有这些方法都是可链接的。
在另一种方法中,我有一些异步工作要做。
let test = new Test();
console.log(test.something()); // Test
console.log(test.asynch()); // undefined since the async code isn't done yet
console.log(test.asynch().something()); // ERROR > My goal is to make this
由于所有其他方法都是可链接的,如果这个唯一方法不是,我觉得用户会很奇怪。
有没有办法让我维护我的班级的可链接主题?
我已经想过在这个方法的参数内的回调函数中传递下一个方法,但这并不是真的链接。
test.asynch(() => something())
与Promises 相同,它不是真的链接。
test.asynch().then(() => something())
我想要的结果是
test.asynch().something()
这是一个演示我的问题的 sn-p:
class Test {
/**
* Executes some async code
* @returns {Test} The current {@link Test}
*/
asynch() {
if (true) { //Condition isn't important
setTimeout(() => { //Some async stuff
return this;
}, 500);
} else {
// ...
return this;
}
}
/**
* Executes some code
* @returns {Test} The current {@link Test}
*/
something() {
// ...
return this
}
}
let test = new Test();
console.log(test.something()); // Test
console.log(test.asynch()); // undefined
console.log(test.asynch().something()); // ERROR > My goal is to make this work.
【问题讨论】:
-
使用 promises 怎么样? :stackoverflow.com/questions/39028882/…
-
@NanoPish 它仍然打破了链接,
test.asynch().something()会变成test.asynch().then(() => something()) -
阅读我链接的问题的答案,他使用承诺链接了 3 个函数,似乎解决了您的问题?
-
@Zenoo,不幸的是,您所描述的内容是不可能的。至少,据我所知。然而,它充其量只会为其他阅读它的人产生令人困惑的代码,因为这与惯用语相去甚远。你熟悉使用
async/await,我猜?这差不多是我们可以将异步代码视为同步的。 -
@Zenoo 嗯......现在我想我已经抓住了你的好奇心。我想知道
await是否会扩展到链式执行,但似乎不会:jsfiddle.net/7v5y9jck。您也许可以创建一个类,将每个方法调用卸载到队列中并返回实例本身。实际上,您可能会为此使用Proxy,然后包含一个then方法,该方法最终会作为您的最终结果解析。
标签: javascript asynchronous method-chaining