web-dev-qa-db-ja.com

Angularの約束からの戻り値

私はプロミスと少し混乱しています。 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の出力を取得します

5
Tasos

console.logを使用してpromiseをロギングすると、promiseオブジェクトが返されます。 StorageProviderisLoggedメソッドは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関数が成功関数から何も返さなかった場合、チェーンされたpromiseBundefinedを取得します。同様のことがあなたにも起こっていました。

4
Pankaj Parkar