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

如何确保在ngx-translate获取值后再执行函数返回?

解决ngx-translate异步获取翻译后返回结果的问题

你的问题核心在于**subscribe是异步操作**——函数会在订阅回调执行前就走到return语句,所以返回的textToSpeech还是初始的undefined。要让函数在拿到翻译值后再返回结果,你需要利用Observable本身的特性,或者将其转换为Promise来处理异步逻辑。

方案1:返回Observable(推荐)

既然_translateService.get()返回的是Observable,我们可以直接通过pipe和map操作符处理翻译结果,然后把处理后的Observable返回给调用者,由调用者订阅获取最终值:

test(textePage: string[], params?: Object): Observable<string> {
  return this._translateService.get(textePage).pipe(
    map(res => {
      // 将翻译结果的value值拼接成字符串
      return Object.keys(res).map(e => res[e]).join('');
    })
  );
}

调用方式:

// 在需要使用翻译文本的地方订阅这个Observable
this.test(['welcome.title', 'welcome.subtitle']).subscribe(textToSpeech => {
  // 这里的textToSpeech就是拼接好的翻译内容
  console.log(textToSpeech);
  // 执行后续逻辑,比如传入语音合成API等
});

方案2:使用async/await结合Promise

如果你更习惯同步风格的代码,可以把Observable转换为Promise,用async/await来等待翻译结果:

async test(textePage: string[], params?: Object): Promise<string> {
  // 将Observable转为Promise,等待翻译结果返回
  const translationRes = await this._translateService.get(textePage).toPromise();
  // 拼接翻译内容并返回
  return Object.keys(translationRes).map(e => translationRes[e]).join('');
}

调用方式:

注意调用这个async函数时,要么在另一个async函数里用await,要么用.then()处理:

// 方式1:在async函数中使用await
async someOtherFunction() {
  const textToSpeech = await this.test(['welcome.title', 'welcome.subtitle']);
  console.log(textToSpeech);
}

// 方式2:用.then()处理Promise
this.test(['welcome.title', 'welcome.subtitle']).then(textToSpeech => {
  console.log(textToSpeech);
});

为什么原代码不生效?

简单来说,JavaScript的异步操作不会阻塞代码执行:当你调用subscribe时,浏览器会把这个异步任务放进任务队列,继续执行后面的return textToSpeech,这时候textToSpeech还没有被赋值,所以返回的是undefined。只有当翻译请求完成后,订阅回调里的代码才会执行,这时候赋值已经晚了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:46:10