2015-01-08 1 views
0

Я спросил «Как сопоставить поток с ленивым потоком обещаний» с лимитом параллелизма 1 здесь: map a stream to lazy promise stream. Ответ был flatMapConcat.flatMapConcat с вложенными потоками

Теперь у меня есть два вложенных потока, для которых требуется ограничение параллелизма 1, а flatMapConcat больше не работает.

var getPromise = function(value) { 
    console.log('resolving ' + value); 
    return new RSVP.Promise(function(resolve, reject) { 
     setTimeout(function() { 
     resolve(value); 
     }, 1000); 
    }); 
}; 


var stream = Bacon.fromArray([1,2,3]).flatMapConcat(function(value) { 
    return Bacon.fromPromise(getPromise(value)); 
}); 

//stream.log(); 
// nice sequential 
// resolving 1 
// 1 
// resolving 2 
// 2 
// resolving 3 
// 3 

var secondStream = stream.flatMapConcat(function(promised) { 
    return Bacon.fromPromise(getPromise('second' + promised)); 
}); 


secondStream.log(); 
// mixed up stream and secondStream, not sequential anymore 
// resolving 1 
// resolving second1 
// resolving 2 
// second1 
// resolving second2 
// resolving 3 
// second2 
// resolving second3 
// second3 

// Required output: 
// resolving 1 
// resolving second1 
// second1 
// resolving 2 
// resolving second2 
// second2 
// resolving 3 
// resolving second3 
// second3 

Первый stream не хороший и последовательный, но когда я построить вложенный поток с ним, flatMapConcat больше не работает. Мне нужен первый поток, ожидающий второй поток.

ответ

1

Попробуйте переместить второй .flatMap внутри первого:

var stream = Bacon.fromArray([1,2,3]).flatMapConcat(function(value) { 
    return Bacon.fromPromise(getPromise(value)).flatMapConcat(function(promised) { 
    return Bacon.fromPromise(getPromise('second' + promised)); 
    }); 
});