2016-11-22 1 views
2

У меня есть массив наблюдаемых, который был создан в цикле. А затем объединить все эти наблюдаемые с помощью merge и подписаться на объединенные наблюдаемые. Я не мог найти способ получить контекст наблюдаемого, где он был создан (в цикле). Вот кодRxjs связывает контекст места, где наблюдаемый был создан

let observable = Rx.Observable.bindNodeCallback(request); 
let streams = _(['a', 'b', 'c', 'd']) 
.someMoreLodashStuff() 
.map(val => { 
    // HERE SOMEHOW I WANT TO BIND CONTEXT (e.g. loop val), 
    // SO THAT SUBSCRIBER CAN KNOW THE EXACT LOOP STATE 
    // WHEN RECEIVING RESULT 
    return observable(mutate(val)) 
}) 
.value(); 

Rx.Observable 
.merge(...streams) 
.subscribe(
    (res) => { 
    // HERE I WANT TO GET CONTEXT (e.g. val) 
    }, (err) => { 
    // HERE I WANT TO GET CONTEXT (e.g. val) 
    }, 
() => { 
    //on complete stuff 
    }); 

Update (как спросил @martin)

С @martin спросил о цели этого связывания и что проблема, которую я пытаюсь решить, так что я буду описывать реальную проблему.

ческий и реальная проблема

Я пытаюсь сканировать список веб-сайтов (передается как параметры запроса), принеси их названия и сделать их в HTML и вернуть HTML обратно пользователю. Это часть моего open source repo, где решена эта точная проблема с помощью callbacks node.js, async.js водопада и обещаний. Теперь решая его с помощью rxjs. Это просто способ изучить различные асинхронные методы. Это file from github repo, где с помощью rxjs решить эту проблему

+0

Вы можете вернуть 'this' из первой карты(). Я не понимаю, что это должно делать или какая проблема вы пытаетесь решить. Почему подписчик знает контекст, используемый где-то из оператора map()? – martin

+0

@martin обновил вопрос. Думаю, теперь вы можете лучше понять реальную проблему. И вы можете видеть, что возвращение 'this' с первой« карты »приведет к сбою' Rx.Observable.merge() ', поскольку оно ожидает Observables. – hhsadiq

+0

Я также отметил вас в github (@martinsik) в точной строке в файле, где я хочу привязку. Надеюсь, это может дать вам лучший ответ на ваш вопрос. – hhsadiq

ответ

2

Если вы хотите сохранить ссылку на состояние входа можно использовать flatMap перегрузку, которая принимает resultSelector функцию, чтобы создать кортеж, содержащий слитый вход + выход состояния:

// given a function which can return the body of the page requested 
function doRequest(url) : Observable<string> 

const urls = Rx.Observable.from([a,b,c]) 
    .flatMap(
    a => doRequest(url), 
    (a,res) => ({ url: a, body: res}) 
) 
    .subscribe(resTuple => console.log(`url ${resTuple.url} returned ${resTuple.body}`) 
+0

замечательный ответ, именно то, что я искал. Большое спасибо @Mark. – hhsadiq

+0

только один вопрос, resultSelector доступен только для обработчика успеха, любым способом, которым мы можем попасть на обработчик ошибок – hhsadiq

+0

Вы можете использовать 'catch' для ошибок from doRequest, будет ли эта помощь? –

 Смежные вопросы

  • Нет связанных вопросов^_^