You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular项目中如何将gRPC Web的unary调用转换为Promise?

gRPC Web unary调用转Promise的实现方案

完全可以通过封装Promise的方式把回调形式的gRPC unary调用改为Promise风格,实现如下:

步骤1:封装Promise版调用方法

searchUsers(request: SearchRequest, metadata: grpc.Metadata): Promise<SearchReply.AsObject['resultsList']> {
  return new Promise((resolve, reject) => {
    grpc.unary(User.Search, {
      request: request,
      metadata: metadata,
      host: environment.api.gRpcUser,
      onEnd: res => {
        const { status, message, statusMessage } = res;
        if (status === grpc.Code.OK && message) {
          const result = message.toObject() as SearchReply.AsObject;
          // 可根据业务需要调整返回内容
          resolve(result.resultsList ?? []);
        } else {
          reject(new Error(`请求失败,状态码:${status},错误信息:${statusMessage}`));
        }
      }
    });
  });
}

步骤2:调用示例

你可以选择async/await或者then/catch两种方式调用:

async/await写法(更推荐)

async fetchUsers() {
  this.isLoading = true;
  try {
    const users = await this.searchUsers(你的请求参数, 你的metadata参数);
    // 后续业务逻辑处理
    console.log(users);
  } catch (err) {
    // 错误处理逻辑
    console.error(err);
  } finally {
    // 无论成功失败都重置加载状态
    this.isLoading = false;
  }
}

then/catch写法

fetchUsers() {
  this.isLoading = true;
  this.searchUsers(你的请求参数, 你的metadata参数)
    .then(users => {
      // 后续业务逻辑处理
      console.log(users);
    })
    .catch(err => {
      // 错误处理逻辑
      console.error(err);
    })
    .finally(() => {
      this.isLoading = false;
    });
}

注意事项

  • 可根据业务需求调整Promise resolve的返回值,如需返回完整的查询结果,直接修改resolve内的参数即可
  • 异常分支可自定义错误类型,方便上层调用时做分类处理
  • 原写法仅在请求成功时重置isLoading状态,会导致请求失败时页面一直处于加载状态,调整后移到finally块处理更稳妥

内容的提问来源于stack exchange,提问作者DisplayName

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 12:15:07