eoao
@eoao

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

subscribe内の処理を待つ方法を知りたい

解決したいこと

メソッドAからメソッドBを呼び出し
メソッドB内でObservableを返すメソッドCから受け取った値を、返却値としてreturnしたい。

発生している問題・エラー

RxJsをきちんと理解しているといえないため、そもそもの考え方が誤っているかもしれません。

メソッドBではメソッドCをsubscribeしその中で値を受け取っている。
(Observableを返す場合はsubscribeが必要と思っています)
非同期処理のため、実際に値が来る前にメソッドAにreturnされてしまう。
値が来てからメソッドAにreturnするにはどのようにすればよいか。

該当するソースコード

// ―――――――――――――――――――――――――――――――――――――――――――――――
  methodA(){
    // methodBを実行し、この後の処理に使う値を取得
    let data = this.methodB();
    // 以下dataを使う処理が続く。。。。
  }
// ―――――――――――――――――――――――――――――――――――――――――――――――
  methodB(): Hoge{
    // メソッドAにreturnするための変数hoge
    let hoge_result: Hoge;
    this.methodC().subscribe((hoge) => {
      // この後に使用したいため代入
      hoge_result = hoge;
      // 返却する値の編集を行う
      // hoge_result = 。。。。。。
    })
    // ここが先に実行されてしまう。。。。。
    return hoge_result;
  }
// ―――――――――――――――――――――――――――――――――――――――――――――――
  methodC(): Observable<Hoge>{
    // API実行処理があり、Hogeのレスポンスを返す。。。
    return response;
  }
// ―――――――――――――――――――――――――――――――――――――――――――――――

自分で試したこと

以下のページを参考にさせていただいておりました。
https://qiita.com/pg_yamaton/items/9d1622716625c6bc0781

調べたのですが、subscribeの中で処理をしていたり、
subscribe外で宣言した変数に入れるというのは見つかるのですが
subscribe外の処理が先にされてしまうことについての対策はわかりませんでした。

また、メソッドAとBにasyncをつけて、メソッドAで実行してみましたが、先にBの最後のreturnが行われる結果は変わらずでした。

お力添えよろしくお願いいたします。

0

1Answer

非同期で返ってくるデータを使用する限り,基本的にはmethodBも非同期にする必要があります.
methodBが同期メソッドでなければならない理由は何かありますか?おそらくその場合はメソッドの役割が多すぎるということがいえそうです.

0Like

Comments

  1. @eoao

    Questioner

    メソッドBはメソッドCからの返却値を編集する役割がありました(後続の処理で使用したい形にする)
    メソッドAはBからの返却値を元に呼び出し元へ判定処理(省略)を行い結果を返すという役割でした。
    メソッドBはメソッドAからだけではなく、いろんなところから呼ばれるものであり、最終的にその呼び出し元へは判定結果を返さなければならないため
    同期処理ができないと困る…というようになります。

  2. メソッドBはメソッドAからだけではなく、いろんなところから呼ばれるものであり、最終的にその呼び出し元へは判定結果を返さなければならないため
    同期処理ができないと困る…というようになります。

    いずれにせよ非同期で返ってくるものをすぐに返値にすることはどうがんばってもできないので,同期メソッドに返さないといけない場合はmethodBに返却先を渡すなりしてください.

    methodB(callback){
        this.methodC().subscribe(result => {
          callback(result);
        })
    }
    

    こことかもご覧ください.

Your answer might help someone💌