Подождите, пока наблюдаемое закончится - PullRequest
0 голосов
/ 18 марта 2020

Я возвращаю 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], поскольку он не ожидает переведенного текста

1 Ответ

0 голосов
/ 18 марта 2020

Строка let textT = this.translateAction(v).subscribe(... назначает подписку на textT, затем следующая строка return textT; возвращает эту подписку. Лишь позже textT переназначается на переведенную строку. Какой бы метод ни использовался во втором блоке кода, он должен быть асинхронным ie 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() возвращает наблюдаемое

...