2016-08-31 1 views
1

Как сделать что-то похожее на код ниже?Как сделать асинхронную трубу в rxjs @ 5?

.map(async request => await asyncRequest(request)) 

Событие кликает данные сбора и создает объект запроса. Затем вызовите .next (запрос). Как получить [object Promise] и json?

let a = Rx.Observable.create(observer => { 
    Rx.Observable.fromEvent(document, 'click') 
    .do(() => observer.next()) 
    .subscribe(result => console.log(`[a] complete`), error => console.log(`a error: ${error}`)); 
}); 


function asyncRequest(request) { 
    return Rx.Observable.create(observer => { 
    new Promise((resolve, reject) => { 
     setTimeout(() => resolve('response'), 1000); 
    }) 
    }) 
} 

a 
    .map(request => asyncRequest(request)) 
    .do(json => console.log(json)) // to get json 
    .subscribe(result => console.log(`complete: ${result}`)) 

ответ

1

Вы должны использовать flatMap вместо map

let a = 
    Rx.Observable.fromEvent(document, 'click') 
    //Console loggin is a side effect, so make it the do instead of 
    //wrapping the Observable 
    .do(_ => console.log(`[a] complete`), 
     error => console.log(`a error: ${error}`)); 


function asyncRequest(request) { 
    //This will actually handle the result of the Promise 
    return Rx.Observable.defer(() => 
    new Promise((resolve, reject) => { 
     setTimeout(() => resolve('response'), 1000); 
    }) 
); 
} 

a 
    //Kicks off an async request each time an event comes in 
    //and then flattens the response into the stream. 
    .flatMap(asyncRequest) 
    .do(json => console.log(json)) // to get json 
    .subscribe(result => console.log(`complete: ${result}`))