首页 > 解决方案 > 异步函数如何等待内部异步函数的回调?

问题描述

我有一个异步函数,当内部异步函数的回调返回时必须返回。我不能等待那个内部函数,因为它没有返回一个承诺。我已经尝试指定await传递回调,但这并不能解决问题。像这样:

async getPublicKey(): Promise<string> {

    const callback = async (err: any, key: any) => {
      if (!err) this.publicKey = key.result;
      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函数会立即返回(不能等待它)。

标签: javascripttypescriptasynchronousasync-awaites6-promise

解决方案


您需要将回调包装在 a 中new Promise并返回resolveor 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);

    })
  })
}

推荐阅读