簡體   English   中英

等待 Observable 完成

[英]Wait for Observable to finish

我從承諾中返回 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;
    }

我想將該文本保存到存儲中並返回翻譯(else 塊)

     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],因為它不等待翻譯文本

let textT = this.translateAction(v).subscribe(...將訂閱分配給textT然后下一行return textT;返回該訂閱。只有稍后textT重新分配給翻譯的字符串。無論哪種方法,第二代碼塊需要是異步的,即 return 和 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM