【问题标题】:Wait for Observable to finish等待 Observable 完成
【发布时间】:2020-03-18 17:26:22
【问题描述】:

我从 Promise 中返回 Observables

第一个返回翻译的这个

    translateAction(t): Observable<any>{
      const params = {
        Text: t,
        SourceLanguageCode: "en",
        TargetLanguageCode: "es"
      };
      let actionPromise = this.translate.translator.translateText(params).promise();
          let observe = Observable.fromPromise(
            actionPromise.then((data) => {
              return (data.TranslatedText);
            }).catch((err) => {
              console.log(err);
              return err;
            })
          );
          return observe;
    }

我想将该文本保存到存储中并返回翻译(其他块)

     let st = this.storage.get("translationCache");
     let observeSt = Observable.fromPromise(
       st.then((val) => {
         console.log("alo?49");
          if(val && val.hasOwnProperty(value)){
            let v = value;

              console.log("Encontrado en memoria:");
              console.log(val[v]);

              return val[v];

          }else{
                console.log("alo?60");
                let v = value;
                let textT = this.translateAction(v).subscribe(t => {
                  textT = t;
                  if(val === null){
                    val = {};
                  }
                  val = Object.assign(val, {[v] : textT});
                    this.storage.set('translationCache', val);
                    console.log("traduccion añadida");
                    console.log(v + ":" + textT);
                  return textT;
                },err => {console.log(err)}); return textT;
              }
            })
         );

         return observeSt;

预期行为:将文本保存在存储中,然后返回翻译。

当前行为:一段时间后保存数据,但返回[Object Object],因为它不等待翻译文本

【问题讨论】:

    标签: angular ionic-framework observable angular2-observables


    【解决方案1】:

    let textT = this.translateAction(v).subscribe(... 行将订阅分配给textT,然后下一行return textT; 返回该订阅。直到后来,textT 才被重新分配给翻译后的字符串。无论第二个代码块是什么方法都需要是异步的,即返回和 Observable、Promise,或者有一个回调。可能喜欢:

    doStuff(): Observable<any> {
      ...
      let v = value;
      return this.translateAction(v).pipe(
        tap({
          next: t => {
            let textT = t;
            if (val === null) {
              val = {};
            }
            val = Object.assign(val, { [v]: textT });
            this.storage.set('translationCache', val);
            console.log("traduccion añadida");
            console.log(v + ":" + textT);
          },
          error: err => { console.log(err) }
        })
      );
    }
    

    doStuff() 返回一个 Observable

    【讨论】:

    • 对不起,我想我错过了一些重要的东西,所有这些都在来自storage.get 的承诺中,它从承诺中返回了一个 Observable,我将编辑问题中的代码。我试过这种方式,但它现在没有保存在存储中,它只是显示 [Object Object]
    猜你喜欢
    • 1970-01-01
    • 2018-10-06
    • 2018-08-06
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 2021-11-16
    • 2015-10-28
    • 1970-01-01
    相关资源
    最近更新 更多