Mantenga el objeto encadenable utilizando métodos asincrónicos

Digamos que tengo una claseTest con alrededor de 10-20 métodos, todos los cuales son encadenables.

En otro método, tengo un trabajo asincrónico que hacer.

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 

Dado que cualquier otro método es encadenable, creo que sería extraño para el usuario si este único método no lo fuera.

¿Hay alguna manera de mantener la cadenatem de mi clase?

Ya he pensado en pasar el siguiente método en una función de devolución de llamada dentro del parámetro de este método, pero no esDe Verda encadenando

test.asynch(() => something())

Lo mismo conPromises, no esDe Verda encadenando

test.asynch().then(() => something())

El resultado que quiero es

test.asynch().something()

Aquí hay un fragmento que demuestra mi problema:

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.

Respuestas a la pregunta(3)

Su respuesta a la pregunta