将变量传递给可观察的

时间:2017-07-03 14:27:40

标签: angular typescript

我目前正以下列方式使用一个observable:

this._socket.onMessage.subscribe(
    (message) => {

    }
);

工作正常!但是,是否可以将变量传递给允许某些逻辑的observable?

例如,通过将变量“name”传递给onMessage,我只能订阅名称特定的事件?像这样:

this._socket.onMessage(name-variable).subscribe(
    (message) => {
        // only get events that is related to the name-variable
    }
);

5 个答案:

答案 0 :(得分:4)

您必须创建可产生所需效果的辅助函数。

fn sort<A, T>(mut array: A) -> A
where
    A: AsMut<[T]>,
    T: Ord,
{
    let slice = array.as_mut();
    slice.sort();

    array
}

fn main() {
    let a = [1, 3, 2];

    assert_eq!(sort(a), [1, 2, 3]);
}

更高级的方法是创建自己的类,扩展其中一个public getMessagesForName(name: string): Observable<any> { return this._socket.onMessage.filter((message) => { return message.name === name; }); } 类。像SubjectEventEmitter一样,并在那里添加辅助函数。然后,您只需将过滤器应用于Subject参考。

以下是一个例子:

this

这一切都取决于你需要多少重复使用。

答案 1 :(得分:3)

编辑:请参阅ThnkingMedia的答案

我不确定你是否可以使用你正在寻找的语法来做到这一点,但是你可能会做一些事情

let flag: boolean = someProperty;
this._socket.onMessage.subscribe(
    (message) => {
        if (flag) { // do something
        }
    }
);

另外,我非常确定您的Observable可以使用filter()调用。所以Observable可能会改变

myObservable.filter(...).map(...).subscribe(....)
//where myObservable is the Observable object you're working with    

答案 2 :(得分:1)

对于需要此功能的任何人,您可以通过以下方式将变量传递给可观察对象并同时使用观察者:

function onMessage(message): Observable<any>{
   return new Observable(observer => {
      socket.message(message).subscribe(result => {
         observer.next(result); 
      });
   });
}

这样你就可以像这样使用它:

onMessage('Hello World').subscribe(msg => {
   alert(msg);
});

答案 3 :(得分:0)

我不太明白你的意思,但是你可以将值传递给Observable。代码非常简单

returnCustomObservable() {
    return Observable.of('Your value here');
}

但是,如果我找到你的话,这意味着你必须重写onMessage函数来为它提供你想要的值。

答案 4 :(得分:0)

你可以通过一个小的设计转变来做类似的事情:

function handleFoo(data) {}

function handleBar(data) {}

const messageGroups = {
  foo: handleFoo
  bar: handleBar
}

this._socket.onMessage.subscribe(
    (message) => messageGroups[message.type](message)
);

这将允许对特定消息组进行更通用的处理,这是实现MDN建议的一种更简洁的方法:https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications#Receiving_messages_from_the_server