2017-09-07 22 views
-1

私はtypescriptを初めて使用しています。Typescipt。関数が実行終了するまでコードを実行するまで待ちます

Iは以下に示すように関数を呼び出すコードを有する:

this.getAllOptions(questionID); 
console.log("++++++++++++++++++++++++++++++++"); 
console.log(this.result); 

の機能は、オブジェクトの配列を返すサービスを呼び出し、非常に簡単です。返されたデータから、以下に示すように、文字列形式の "item.Content"のみが必要です。

result: string; 
getAllOptions(question_ID){ 

    this.result = ""; 

    this._service.getOptionsQuestion(question_ID) 
     .subscribe(data => { 
      data.forEach(item => { 
      console.log(item.Content); 
      this.result += item.Content; 
      }); 
     }); 
} 

しかし、問題は、関数getAllOptions()を呼び出した後のコードが最初に実行されることです。関数が実行されるまでメソッドを呼び出すのを待ってからコードを欲しい。

これは可能ですか?

答えて

0

データが到着するまで待つ必要があります。 getOptionsQuestionへの呼び出しが完了したら、getOptionsQuestionで作成されたオブザーバブルはデータをまだ受信していないので、subscribeに渡されたコールバックはまだ呼び出されていません。

は個人的に私が好む、データを待つために、いくつかのアプローチがあり、非同期/のawait構文活字体で、より読みやすいコードになり:

import 'rxjs/add/operator/toPromise'; 
import 'rxjs/add/operator/map'; 
import * as rsx from 'rxjs' 

class Test { 
    // Dummy service decalration 
    _service : { 
     getOptionsQuestion(nr: number): rsx.Observable<Array<{Content : string }>> 
    } 

    result: string; 
    async getAllOptions(question_ID: number){ 

     this.result = ""; 
     const data = await this._service.getOptionsQuestion(question_ID).toPromise() 

     data.forEach(item => { 
      console.log(item.Content); 
      this.result += item.Content; 
     }); 
    } 
    async otherMethod (questionID : number){ 
     await this.getAllOptions(questionID); 
     console.log("++++++++++++++++++++++++++++++++"); 
     console.log(this.result); 
    } 
} 
0

我々はまた、からの約束を返すことで問題に対処することができますgetAllOptions関数。

result: string; 

getAllOptions(question_ID): Promise<void>{ 
    let resolveRef; 
    let rejectRef; 

    //create a new promise. Save the resolve and reject reference 
    let dataPromise: Promise<void> = new Promise((resolve, reject) => { 
     resolveRef = resolve; 
     rejectRef = reject; 
    }); 
    this.result = ""; 

    this._service.getOptionsQuestion(question_ID) 
     .subscribe((data: any) => { 
      data.forEach(item => { 
      console.log(item.Content); 
      this.result += item.Content; 
      }); 
      // resolve the promise once result is populated 
      resolveRef(null); 
     }); 

    //return promise created. 
    return dataPromise; 
} 


// execute the console logs on then part of the promise returned by getAllOptions 
this.getAllOptions(questionID).then(() => { 
    console.log("++++++++++++++++++++++++++++++++"); 
    console.log(this.result); 
}); 
関連する問題