承诺系列重复代码避免

时间:2017-08-23 14:04:45

标签: javascript node.js asynchronous promise

使用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但它不会编译

4 个答案:

答案 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());
}