/ / Angular2 Acessando o primeiro elemento em Observável de matriz - angular, rxjs, observável

Angular2 Acessando o primeiro elemento em Observable of array - angular, rxjs, observable

EDIT: Eu finalmente tenho o meu problema em uma jogada em https://plnkr.co/edit/A2WipJwW9kEhhlh90xMj. Se você atingir o mercado selecionado, pressione enter e ele entrará no marketSelectorDropDown no arquivo market-search.component.ts. O problema está nas poucas linhas abaixo do mapa e a assinatura nunca é executada até que o menu suspenso do mercado selecionado seja clicado novamente. Eu não entendo o porquê. Qualquer ajuda é muito apreciada!

this.markets
.map(markets => {
debugger
if(markets && markets.length > 0) return markets[0];
})
.subscribe((market: Market) => {
debugger
this.pick(market.name)
});

EDIT: Nos comentários daquele marcado como a resposta é a resposta. É para usar um BehaviorSubject. Isso permite que os assinantes atrasados ​​recebam o último evento enviado.

Respostas:

3 para resposta № 1

De acordo com a documentação do RxJS5

Primeiro operador

Se chamado sem argumentos, emite primeiro oprimeiro valor da fonte Observável, em seguida, é concluído. Se chamado com uma função predicada, primeiro emite o primeiro valor da fonte que corresponde ao especificado condição. Também pode ser necessária uma função resultSelector para produzir o valor de saída do valor de entrada e um valor padrão para emitir caso a fonte é concluída antes de poder emitir um valor válido. Lança um erro se defaultValue não foi fornecido e um elemento correspondente for não encontrado.

É útil se você lida com o Observable do evento

Por exemplo, emita apenas o primeiro clique que acontece no DOM (como .one em jQuery)

var clicks = Rx.Observable.fromEvent(document, "click");
var result = clicks.first();
result.subscribe(x => console.log(x));

Ou você pode procurar outro caso de uso nesta resposta O angular 2 runOutsideAngular ainda altera a interface do usuário

Portanto, não é exatamente isso que você deseja, mas você pode usá-lo assim:

.first(null, arr => arr[0]).subscribe...

e deve retornar o primeiro elemento desejado da matriz Exemplo de Plunker(primeiro)

Mas eu aproveitaria map operador para fazer o mesmo:

.map(arr => arr[0]).subscribe...

Exemplo de Plunker(mapa)


0 para resposta № 2

Seu exemplo não funciona porque você está usando o CDN para o RxJS 2. Você precisa do RxJS 5 para isso. Tentei substituir o CDN para a versão 5 e estava funcionando muito bem.