2017-09-20 14 views
0

アングルアプリケーション(ng4)のコンポーネントにデータを返すサービスを書くのに忙しいです。データはスマートコントラクトから取り出されます。サービスからコンポーネントへのデータの返信

私は、次のエラーを取得しているようだ:

HomeComponent_Host.html:1 ERROR TypeError: this.smartContractService.getDrawId(...).subscribe is not a function 

マイ部品コード:

this.smartContractService.getDrawId().subscribe(data => { 
     console.log('Result:: ', data); 
    }); 

そして、私のサービスメソッド:

getDrawId(): Observable<any> { 
    let gameObject; 
    return this.Game 
     .deployed() 
     .then(instance => { 
      gameObject = instance; 
      return gameObject.getDrawId.call(); 
     }) 
     .then(value => { 
      return value; //console.log(value) returns the data. 
     }) 
     .catch(error => { 
      console.error('Error getting draw id; see log.'); 
      console.log(error); 
     }); 
} 

私が取得する方法を確認していませんサービスから呼び出し元のコンポーネントに戻ってくるデータ...

+1

約束と観測のミックスアップがあるようです。 getDrawIdのコードの大半は、 'this.Game.deployed()'が '.then'sと' .catch'esを使って)約束を返しているように書かれていますが、戻り値の型が 'Observable 'それを観察可能なものとして使用しようとする。 –

+0

ええ、約束と観測は私のアキレス腱です。私のことを混乱させてください。 – HappyCoder

+1

@HappyCoder、ObservablesはPromisesとよく似ていますが、Promisesは1回限りのものです(つまり、HTTPリクエストを行い、応答を返します)、Observablesは連続しています...最も基本的なのは、パブリッシュ/サブスクライブすると、何かが値を引き出して先入れ先出しキューにプッシュされます。また、1人以上の加入者がいる場合、それらの値を加入者にプッシュし始める。繰り返しますが、これは最も基本的な例です。 – gonzofish

答えて

2

あなたは約束とオブザーバブルを組み合わせようとしているようです。約束事とオブザーバビリティは、どちらも非同期のものに対処することを意図しているので、少し似ています。しかし、約束事は最終的な価値を1つしか扱わないが、Observablesは0,1、または多くの値の流れを扱う。

明らかに、this.Game.deployed()は約束を返しています。これは.then(約束事とやりとりする方法です)を呼び出すためです。しかし、getDrawIdはObservable<any>を返すと主張し、あなたは.subscribeを呼び出しています。観察可能なものにしか存在せず、約束ではない機能。

パスの転送は、目的が何であるかによって異なります。 this.game.deployedは、あなたがこれを行うことができ、その場合には約束、おそらくあなたは全体の約束を使いたい、返すので:また

getDrawId(): Promise<any> { //<--- type changed 
    let gameObject; 
    return this.Game 
     .deployed() 
     .then(instance => { 
      gameObject = instance; 
      return gameObject.getDrawId.call(); 
     }) 
     .then(value => { 
      return value; //console.log(value) returns the data. 
     }) 
     .catch(error => { 
      console.error('Error getting draw id; see log.'); 
      console.log(error); 
     }); 
} 

// And use it with .then instead of .subscribe 
this.smartContractService.getDrawId().then(data => { 
    console.log('Result:: ', data); 
}); 

を、多分あなたは、その場合、あなたはどちらかの可能性、getDrawIdが観察を返すようにしたいですあなたがthis.Game.deployed()を作成するより大きなリファクタを実行します。またはあなたがあるとして約束の周りに観察を作成することを残すことができる:

getDrawId(): Observable<any> { 
    let gameObject; 
    return Observable.fromPromise(this.Game 
     .deployed() 
     .then(instance => { 
      gameObject = instance; 
      return gameObject.getDrawId.call(); 
     }) 
     .then(value => { 
      return value; //console.log(value) returns the data. 
     }) 
     .catch(error => { 
      console.error('Error getting draw id; see log.'); 
      console.log(error); 
     }); 
    ); 
} 

をまた、私はあなたのコードから<any>の中に残っている間、私はあなたがそれを知っていれば、より具体的な形を作るお勧めします。

+0

詳細な対応をありがとうございます。私はいつかこれらの権利を得るでしょう! – HappyCoder

関連する問題