Não sei como extrair valor de Observable para ser retornado pela função em que Observable está presente. Preciso apenas de um valor para ser devolvido, nada mais.
Versão atual que funciona
function getValueFromObservable() {
this.store.subscribe(
(data:any) => {
console.log(data)
}
)
}
getValueFromObservable()
Preciso que isso funcione, funcione para retornar o valor e, em seguida:
function getValueFromObservable() {
this.store.subscribe(
(data:any) => {
return data
}
)
}
console.log(getValueFromObservable())
O que eu estou fazendo errado aqui?
typescript
angular
rxjs
rxjs5
Urso de pelúcia
fonte
fonte
subscribe
Respostas:
EDITAR: código atualizado para refletir as mudanças feitas na forma como os tubos funcionam nas versões mais recentes do RXJS. Todos os operadores (veja meu exemplo) agora estão agrupados no operador pipe ().
Sei que essa questão foi há um bom tempo e com certeza você tem uma solução adequada agora, mas para quem está procurando por isso, sugiro resolvê-la com uma promessa de manter o padrão assíncrono.
Uma versão mais detalhada seria criar uma nova promessa:
Na ponta receptora, você terá então "esperar" que a promessa seja resolvida com algo assim:
Uma solução mais simples seria usar RxJS '.toPromise () em vez disso:
O lado receptor permanece o mesmo que acima, é claro.
fonte
getValueFromObservable
função?Esta não é exatamente a ideia correta de usar
Observable
No componente, você deve declarar o membro da classe que conterá um objeto (algo que você vai usar em seu componente)
Então, um
Service
estará retornando para você umObservable
:Component
deve se preparar para conseguir recuperar um valor dele:Você deve atribuir um valor de a
Observable
a uma variável:E seu modelo consumirá variáveis
name
:Outra forma de uso
Observable
é através doasync
pipe http://briantroncone.com/?p=623Observação : se não for o que você está perguntando, atualize sua pergunta com mais detalhes
fonte
name
disponibilizar fora do callback atribuindo-o àname
variável do componente . Não é possível retornarname
sincronizadamente no seu caso.Oninit
dessa forma, e se eu precisar retornar explicitamente, Meu código de chamada se parece com istothis.actions$.ofType(SearchActions.SEARCH_MULTIPLE_NEW_QUERY).map(toPayload).fnWithMultipleAsyncReturns()
Se você quiser fazer uma pré-assinatura do mesmo Observable que será retornado, basta usar
fonte
.map(data => data)
que faz a mesma coisa e, em seguida,do
agora é chamadotap
e você deve usá-lo em um pipe. Observe também quetap
usa vários parâmetros para manipuladores diferentes, comonext
,complete
eerror
.Parece que você está procurando por um getter de "valor atual" dentro de um observável, quando ele emite e após uma emissão.
Subject
eObservable
não tem tal coisa. Quando um valor é emitido, ele é passado para seus assinantes eObservable
é feito com ele.Você pode usar o
BehaviorSubject
qual armazena o último valor emitido e o emite imediatamente para novos assinantes.Também possui um
getValue()
método para obter o valor atual;Leitura adicional:
RxJS BehaviorSubject
Como obter o valor atual do Assunto RxJS ou Observável?
fonte
Os valores observáveis podem ser recuperados de qualquer local. A sequência de origem é primeiro enviada a um observador especial capaz de emitir em outro lugar. Isso é obtido com a classe Assunto das extensões reativas (RxJS).
Armazene o valor no observador .
Para recuperar o valor de outro lugar, inscreva-se no observador assim:
Os assuntos são observáveis e observadores. Existem outros tipos de assunto , como BehaviourSubject e ReplaySubject para outros cenários de uso.
Não se esqueça de importar RxJS.
fonte
Embora as respostas anteriores possam funcionar de certa forma, acho que usar BehaviorSubject é a maneira correta se você quiser continuar usando observáveis.
Exemplo:
No Serviço:
Em component.ts:
Eu espero que isso ajude!
fonte
Por exemplo, este é o meu modelo html:
Este é o campo vinculado ao modelo do meu componente:
Eu busco gêneros de filmes do servidor dinamicamente. Para me comunicar com o servidor que criei
FilmService
Este é o método que comunica o servidor:
Por que esse método
Observable<Genre[]>
não retorna algo comoGenre[]
?JavaScript é
async
e não espera que um método retorne valor após um processo caro. Com caro quero dizer um processo que demora a retornar valor. Como buscar dados do servidor. Então você tem que retornar a referência do Observable e assiná-la.Por exemplo, em meu componente:
fonte
No caso acima, console.log é executado antes que a promessa seja resolvida, então nenhum valor é exibido, altere para o seguinte
outra solução é quando você precisa de dados dentro de getValueFromObservable para retornar o uso observável de operador e assinar a função.
fonte
No mundo do javascript de thread único, assíncrono, orientado a promessas e tendências reativas,
async/await
é o melhor amigo do programador de estilo imperativo:E caso
store
seja uma sequência de múltiplos valores:fonte
A maneira decente seria retornar o observável de uma função e assiná-lo sempre que necessário, porque os observáveis são preguiçosos, eles começarão a emitir valores apenas quando forem assinados.
Aqui eu tenho mais uma solução orientada a eventos interessante, com a qual inicialmente usei para brincar. O exemplo a seguir faz isso usando o módulo " events " de nodejs. Você pode usá-lo com outras estruturas onde existe um módulo semelhante ( Observação : a sintaxe e o estilo podem mudar dependendo do módulo usado).
É apenas um exemplo para mostrar uma ideia onde podemos passar dados de diferentes lugares pelo método de emissão e escuta. Isso também é conhecido como código orientado a eventos.
fonte