2015-01-08 51 views
0

我已经问过“如何将流映射到惰性承诺流”,并发限制为1:map a stream to lazy promise stream。答案是flatMapConcatflatMapConcat与嵌套流

现在我有两个嵌套流,需要并发限制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)); 
    }); 
});