Jsonオブジェクトを含むobservableを返すUsernameService
があります。 AnotherService
では、UsernameService
オブジェクトから値を注入します。
これまでのところ、UsernameServiceからオブザーバブルをサブスクライブでき、コンソールに表示できます。コンソールでオブジェクトの値の1つをドリルダウンして表示することもできます。ただし、使用できる変数にその値を割り当てる方法がわかりません。代わりに、変数に値を割り当てようとすると、コンソールで次のようになります:Subscriber {closed: false, _parent: null, _parents: null...etc
コンソールに観測可能な値を正常に表示している私の例を次に示します。
import { UsernameService } from './username.service';
import { Injectable, OnInit } from '@angular/core';
import 'rxjs/Rx';
@Injectable()
export class AnotherService {
username: any[] = [];
constructor(private getUsernameService: UsernameService) { }
someMethod() {
let myFinalValue = this.getUsernameService.getUsername()
.subscribe(username => console.log(username.data[0].AccountName));
}
}
上記のコードにより、コンソールは変数AccountName
に割り当てようとしているmyFinalValue
フィールドの値を正しく表示します。しかし、どこがおかしいのかわかりません。
(コンソールにログインするのではなく)単純に値を取得するために同じ手法を使用しようとすると、汎用:Subscriber {closed: false, _parent: null, _parents: null
... etc前述したように。
エラーの原因となるコードの例を次に示します。
import { UsernameService } from './username.service';
import { Injectable, OnInit } from '@angular/core';
import 'rxjs/Rx';
@Injectable()
export class AnotherService {
username: any[] = [];
constructor(private getUsernameService: UsernameService) { }
someMethod() {
let myFinalValue = this.getUsernameService.getUsername()
.subscribe(username => this.username = username.data[0].AccountName);
console.log(myFinalValue);
}
}
最終的に、私の目標は、値をsername.data [0] .AccountNameから変数myFinalValueに割り当てることです。
よろしくお願いします!
オブザーバブルは非同期であり、スーレンが「コールバックは終了したときのみ動作するので、いつわからない」ので、コンポーネントngOnInItの最初のサービスにサブスクライブしていたコードを開始する必要がありました。そこから、サブスクライブ値をコンポーネントのメソッドに渡す必要がありました。このメソッドは、実際にサービスからサブスクライブをパラメーターとして呼び出します。
これが私のコンポーネントの一部です(getCharges()メソッドにgetCharges(accountName)として渡されるthis.username値を見ることができます)。
getCharges(accountName) {
this.getChargesService.getCharges(accountName)
.subscribe((charges) => {
this.charges = charges.data;
}, (error) => console.log(error)
)
}
ngOnInit() {
this.getUsernameService.getUsername()
.subscribe(username => {
this.username = username.data[0].AccountName;
this.getCharges(this.username);
})
}
次に、getUsernameService.getUsername()サービス/メソッドを含むサービスファイルで、目的の値を含むパラメーターを変数に簡単に割り当てることができました。
お役に立てば幸いです!
呼び出しは非同期であるため(コールバックは終了時にのみ機能し、いつ実行されるかはわかりません)、非同期呼び出しから値を返すことはできません。したがって、呼び出しが終了したときにのみ値を割り当てる必要があります。 username
メソッドで取得するsubscribe
に関連するロジックを実行する必要があります。後でクラスで使用するために、username
の値を保持するフィールドを作成する必要があります。
@Injectable()
export class AnotherService {
username: any[] = [];
myFinalValue: string;
constructor(private getUsernameService: UsernameService) { }
someMethod() {
this.getUsernameService.getUsername()
.subscribe(username => this.myFinalValue = username.data[0].AccountName));
}
}