使用javascript承诺,我必须创建一个需要执行以下功能的ES6类
list() {
if(this.isConnected){
return ActilityAPI.list().then(result => {
return result
});
}else{
return this.connect().then(() => {
return ActilityAPI.list().then(result => {
return result
});
})
}
}
正如您所看到的,我需要编写几部分代码。通过同步功能,它会更容易,例如:
list() {
if(this.isConnected) this.connect()
return ActilityAPI.list()
}
我想尝试相同的算法,但有希望。我该怎么办?
感谢alexmac,我想尝试ES7方式,所以我做了以下几点:
list() {
// return new Promise((resolve, reject) => {
return (async () => {
if (!this.isConnected) await this.connect();
return ActilityAPI.list()
})
}
我也尝试过在列表()之前添加tje async但它不会编译
答案 0 :(得分:0)
你想要做这样的事情:
class Foo {
constructor () {
this.connected = someFunctionThatConnects();
}
list () {
return this.connected.then(() => ActilityAPI.list());
}
}
其中someFunctionThatConnects
返回一个承诺。
答案 1 :(得分:0)
作为一个单行程序,感谢三元运算符,您可以这样做:
const list = () =>
(!this.isConnected ?
this.connect() :
Promise.resolve())
.then(() => ActilityAPI.list())
Promise.resolve创建一个新的Promise并立即解析它,调用then-Handler。
在一个类中,const显然已经过时了。
但在阅读完其他答案之后,我认为要走的路是将检查和连接承诺提取到一个自己的函数,如:
class {
connectIfNotConnected = () =>
!this.isConnected ?
this.connect() :
Promise.resolve();
list = () =>
this.connectIfNotConnected()
.then(() => ActilityAPI.list())
}
因为如果API上有更多操作,你需要再次检查,这样你就拥有了一个完全正确的功能,无论如何。 它只需要在准备就绪时返回一个Promise。
答案 2 :(得分:-1)
如果你想使用ES6类和ES7 async / awit,代码可能如下所示:
class db {
async list() {
if (!this.isConnected) {
await this.connect();
}
return ActilityAPI.list();
}
答案 3 :(得分:-1)
以下是您的代码可以重写的简洁方法:
list() {
const ensureConnected = this.isConnected
? Promise.resolve()
: this.connect();
return ensureConnected.then(() => ActilityAPI.list());
}