私はプロミスと少し混乱しています。 Ionic + Angularに次のプロバイダーがあります:
@Injectable()
export class StorageProvider {
constructor( public storage:Storage ) {}
save(keyname: string, data: any): Promise<any> {
return this.storage.set(keyname, data);
}
retrieve(keyname: string): Promise<any> {
return this.storage.get(keyname);
}
clear(): Promise<void> {
return this.storage.clear();
}
delete(keyname): Promise<any> {
return this.storage.remove(keyname);
}
isLogged() {
return this.retrieve('user').then( value => { value ? true : false });
}
}
そして私のコンポーネントの1つ:
console.log(this.storage.isLogged());
問題は、true
またはfalse
ではなくpromiseオブジェクトを返すことです。
コンポーネントを次のように変更した場合:
this.storage.isLogged().then(function(data) { console.log(data)});
次に、undefined
の出力を取得します
console.log
を使用してpromiseをロギングすると、promiseオブジェクトが返されます。 StorageProvider
のisLogged
メソッドはtrue/false
を返して、基になる呼び出し元が.then
成功コールバック内で値を受け取るようにする必要があります。
isLogged() {
return this.retrieve('user').then( value => {
//this return will `return` value in chained manner
return value ? true : false;
});
}
発信者
this.storage.isLogged().then(
(value) => console.log("isLogged", value)
)
Promiseは非同期リクエストを処理する方法であり、基本的には.then
に表示される3つの関数があります。
myPromiseCall().then(successFn, errorFn, notifyFn)
約束の甘い特性は、簡単に連鎖できることです。そのため、相互依存の非同期コードは読みやすくなります。したがって、あるプロミスのデータを別のプロミスに渡すケースがあるときはいつでも、そのときにpromiseA
successからデータを返します。たとえば、promiseB
successで自動的に使用できるようになります。未満
promiseA(){return promise };
promiseB(){ return promise };
promiseA().then(
//success fn
(data) => {
//do something
return data;
}
).then(
//success fn
(promiseAData) => {
console.log("Promise A data", promiseAData);
//do some awesome thing based on data retrieved from promiseA
return promiseB();
}
).then(successFn, errorFn)
promiseA
からデータを返すことは重要なタスクでした。つまり、データを返したときに、基礎となるチェーンされたpromise成功コールバック関数がそのデータを取得しました。 promiseA
関数が成功関数から何も返さなかった場合、チェーンされたpromiseB
はundefined
を取得します。同様のことがあなたにも起こっていました。