2017-09-13 6 views
0

私はEmberアプリを持っています。質問するたびに、2つのホストに送信します。これはどうすればいいですか?Emberが同じモデル内の複数のホストからデータを取得するように設定するにはどうすればよいですか?

例:2つのバックエンドホストを考える

hosts=['host1-url', 'host2-url']、 私はthis.get('store').findAll('post')

を行うときは、一緒に結果をCONCAT、その後、host1-url/postshost2-url/postsを呼び出します。

答えて

2

単一のモデルをクエリするには、adapterのカスタムモデルを作成し、独自のfindAllメソッドを実装する必要があります。そして、それはこのようなものになります。 HTTPの失敗を処理するためにはまだそれを変更する必要があり、両方のエンドポイントでIDが一意であることを確認しなければならないことに注意してください。

// adapters/post.js 
import DS from 'ember-data'; 
import RSVP from 'rsvp'; 
import $ from 'jquery'; 
import { A } from '@ember/array'; 
import { computed } from '@ember/object'; 

export default DS.RESTAdapter.extend({ 
    hosts: computed(function() { 
    return A(['http://www.host-1-url.com', 'http://www.host-2-url.com']); 
    }), 

    async findAll(store, type, sinceToken) { 
    let query = { since: sinceToken }; 

    // Query both hosts 
    let promises = this.get('hosts').map(async host => await $.getJSON(`${host}/api/posts`, query)); 

    // Get responses 
    let responses = await RSVP.all(promises); 

    // Fabricate a payload that contains all the posts 
    let posts = await [].concat.apply([], responses.map(response => response.posts)); 
    return { posts: posts }; 
    } 
}); 

あなたはこのコードを使用すると、async/awaitキーワードに対応するために、あなたのember-cli-build.jsファイルにこれを追加する必要がありますあなたのエンバーアプリで実行する場合:個人的に

'ember-cli-babel': { 
    includePolyfill: true 
} 

を、私が行くだろうそれは別の方法です。

source1-postsource2-postという2つのモデルを作成し、それぞれ対応するhostを指定するために2つのアダプタを作成し、データをユーザーに提示するときに2つのフィードをマージします。

どちらの方法でも、両方の方法で同じ結果が得られます。

関連する問題