2017-06-14 7 views
1

私は、必要なAPIから特定のデータを返すことができるプロバイダがあります。私はそれをしない、この機能を持っている:プロバイダからのデータを返すJavascriptで約束する関数

public getStoryCount(key: string, val: number) { 
    return this.client.getEntries({ 
     'content_type': xxxxxxxxxxxxxx, 
     [key]: val, 
    }).then((entries:any) => { 
     return entries.total; 
    }); 
} 

は、これは本当に約束を使用して、私の最初の時間ですが、私は値を取得するためのコンポーネントでこれを呼び出すようにしようとしています。私は値を得ることができるようにしたいと思うentry.total私はconsole.log出力を取得します。私はプロバイダの機能をCONSOLE.LOGとき、私は約束の値を参照してください

this.homeScreen.push({ 
    'count': Provider.getStoryCount('sys.id', xxxx) 
}); 

ことができますし、それは次のようになります:

私はそうのように私の見解で使用するデータの配列を構築しています

__zone_symbol__state : true 
__zone_symbol__value : 13 // this is the value I need to get 

私の配列homeScreen ['count']の値に13を保存するにはどうすればいいですか?または私は何を間違っているのですか?

答えて

0

これは非同期操作です。あなたはthenで関数を渡す必要があります:あなたは現在Promiseではなく、実際の値を返すされている

Provider.getStoryCount('sys.id', xxxx) 
    .then((total) => { 
    this.homeScreen.push({ 
    'count': total 
    }); 
    }); 
1

。つまり、コンポーネントコードをこれに変更することを意味します。

Provider.getStoryCount('sys.id', xxxx) 
    .then((entries:any) => { 
     this.homeScreen.push({ 
      'count': entries.total 
     }); 
    } 
}); 

は動作するはずです。

Providerサービスで値を取得し、それをObservableとして保存して、コンポーネントが値をサブスクライブできるようにすることもできます。

0

まず、promiseの結果を別の値にマップするには、mapを使用します。

public getStoryCount(key: string, val: number) { 
    return this.client.getEntries({ 
     'content_type': xxxxxxxxxxxxxx, 
     [key]: val, 
    }).map((entries:any) => { 
     return entries.total; 
    }); 
} 

続いたときに約束は非同期であるので、あなたは思うかもしれないように、あなたが実際にentries.total返却されていません

Provider.getStoryCount('sys.id', xxxx).then((total) => ...use total...); 
1

結果を得るために約束返す関数の使用thenを呼び出します。

独自のコールバック関数を提供するか、(this.client.getEntriesによって生成された)約束を返して、結果にthenを付け加える必要があるでしょう。それは次のようになります。

public getStoryCount(key: string, val: number) { 
    return this.client.getEntries({ 
     'content_type': xxxxxxxxxxxxxx, 
     [key]: val, 
    }); 
    // The 'then' will be added later 
} 

// ... 

// Get the promise from the provider, and invoke 'then' here. 
var storyCountPromise = Provider.getStoryCount('sys.id', xxxx); 
storyCountPromise.then((entries:any) => { 
    this.homeScreen.push({ 
     'count': entries.total 
    }); 
}); 
関連する問題