Как асинхронная функция может ожидать обратного вызова внутренней асинхронной функции?

#javascript #typescript #asynchronous #async-await #es6-promise

Вопрос:

У меня есть асинхронная функция, которая должна возвращаться, когда возвращается обратный вызов внутренней асинхронной функции. Я не могу дождаться этой внутренней функции, потому что она не возвращает обещания. Я пытался указать await при передаче обратного вызова, но это не помогает. Как таковой:

 async getPublicKey(): Promise<string> {

    const callback = async (err: any, key: any) => {
      if (!err) this.publicKey = key.resu<
      else console.error(err);
    };

    this.web3js.currentProvider.sendAsync({
      jsonrpc: '2.0',
      method: 'eth_getEncryptionPublicKey',
      params: [this.account],
      from: this.account,
    }, callback);

    return this.publicKey
  }
 

Здесь цель состоит в том, чтобы вернуть key.result функцию обратного вызова. Однако мы не можем дождаться этого обратного вызова, и sendAsync функция возвращается немедленно (не может дождаться его).

Комментарии:

1. смотреть в util.promisify

Ответ №1:

Вы захотите обернуть обратный вызов в a new Promise и вернуть resolve или reject . Таким образом, вы можете await позвонить await getPublicKey() , и он не разрешится, пока обратный вызов не будет выполнен.

 async getPublicKey(): Promise<string> => {
  return new Promise((resolve, reject) => {
    const callback = async (err: any, key: any) => {
      if (!err) {
          resolve(key.result);
      }
      else {
        reject(err);
      }
    };

    this.web3js.currentProvider.sendAsync({
      jsonrpc: '2.0',
      method: 'eth_getEncryptionPublicKey',
      params: [this.account],
      from: this.account,
    }, callback);

    })
  })
}