2017-03-29 20 views
2

私はRxJSと統合しようとしている第三者図書館を持っています。これはTiger Textというメッセージングライブラリです。彼らによると、私はメッセージと呼ばれるイベントを聞くことができ、ストリームにメッセージがあるときはそれをさらに利用するために使用できます。同じコードスニペットは次のとおりです。 -角度2のRXJSを使用してカスタムイベントを観察するにはどうすればよいですか?

var client = new TigerConnect.Client({ defaultOrganizationId: 'some-org-id' }) 

client.signIn('[email protected]', 's3cr3t', { udid: 'unique-device-id' }).then(function (session) { 
    onSignedIn(session) 
}) 

function onSignedIn(session) { 
    console.log('Signed in as', session.user.displayName) 

    client.messages.sendToUser(
    '[email protected]', 
    'hello!' 
).then(function (message) { 
    console.log('sent', message.body, 'to', message.recipient.displayName) 
    }) 

    client.events.connect() 

    client.on('message', function (message) { 
    console.log(
     'message event', 
     message.sender.displayName, 
     'to', 
     message.recipient.displayName, 
     ':', 
     message.body 
    ) 
    }) 
} 

ここでは、次のコード部分を参照してください。

client.on('message', function (message) { 
    console.log(
     'message event', 
     message.sender.displayName, 
     'to', 
     message.recipient.displayName, 
     ':', 
     message.body 
    ) 
    }) 

は、私は、コードのこの作品のうち、観察可能なを作成するようにストリームにサブスクライブするようにRxJSを使用する方法を知りたいと思ったし、我々は変更があるとき、私は私のように、新しいデータやプロセス、それを取ります願い。

お願いします。

+0

あなたがデータをチェックするために約束を使用しているように思えます。プロミスは一度だけデータをチェックします。 Observableを使う必要があります。詳細が必要な場合は、私は答えとして書くことができます。お知らせ下さい。 –

+0

実際にコードを書いたり貼り付けたサードパーティのライブラリです。ですから、 'client.on'メソッドの中で私はデータが非同期的に来るのを待っています。私はライブラリの内部メカニズムを知らないが、あなたが書くことができればObservableを要求するだろう。私はどのようにするかわからない:( –

+0

あなたは "(機能(セッション)"の部分を変更することができますか? –

答えて

2

カスタムイベントから、観察を作成するためにfromEventPatternを使用することができます。

import { Observable } from 'rx/Observable'; 
import 'rxjs/add/observable/fromEventPattern'; 

const messages = Observable.fromEventPattern(
    handler => client.on('message', handler), 
    handler => client.off('message', handler) 
); 
messages.subscribe(message => console.log(message)); 

あなたが追加したカスタムAPIの追加と削除メカニズムを使用してイベントハンドラを削除fromEventPattern関数に渡します。あなたの質問には含まれていませんが、使用しているAPIがoffメソッドを実装していると仮定しています。

2

通常、カスタムオブザーバブルを作成する必要はありません。ちょうどObservable.create()を使用できます。次に、の寒さまたはのホットを書きたいかどうかによって異なります。

冷たい観測のためにあなたが加入したときの値のプロデューサーを作成し、それを閉じる退会する場合:

Observable.create(obs => { 
    var client = new TigerConnect.Client({ defaultOrganizationId: 'some-org-id' }); 
    client.signIn('[email protected]', 's3cr3t', { udid: 'unique-device-id' }).then(function (session) { 
    onSignedIn(session); 
    }); 

    client.on('message', function (message) { 
    obs.next(...); 
    }); 

    return() => { 
    client.close(); // or whatever... 
    }; 
}); 

をそれとも、書きたい場合ホット観察可能プロデューサーは、任意のサブスクリプションに独立して存在し、ただリスナーを追加/削除する:

var client = new TigerConnect.Client({ defaultOrganizationId: 'some-org-id' }); 
client.signIn('[email protected]', 's3cr3t', { udid: 'unique-device-id' }).then(function (session) { 
    onSignedIn(session); 
}); 

Observable.create(obs => { 
    let listener = client.on('message', function (message) { 
    obs.next(...); 
    }); 

() => { 
    // remove the event listener somehow 
    listener.remove(); 
    }; 
}); 

時には、あなたは、これがSubjectが、この私を使用することによって解決見ることができますObservable.create()を使用するよりも、通常複雑になります。なぜなら、自分自身で作成と破棄のロジックを処理する必要があり、サブジェクトも内部状態を持つ必要があるからです。

+0

私はそうですあなたはリンクで返信してくれてうれしく思います。そして、はい、リンクは本当に同じことを理解するのに便利です。第三者が私に加入する手がかりを与えていないので、コード2をAngular 2に書くのは苦労しました。 –

関連する問題