У меня есть поток чисел, я должен превратить их в поток сообщений, используя обещание. И я хочу сделать это лениво. Поэтому, если я сделаю .take(1)
из потока сообщений, он превратит только один номер в сообщение.map поток к ленивому обещанию поток
Это обещание, которое получает пост из числа:
var getPost = function(author) {
console.log('get post' + author);
return new RSVP.Promise(function(resolve, reject) {
setTimeout(function() {
var result = "Post by " + author;
resolve(result);
}, 1000);
});
};
Я заинтересован только в первом посте, таким образом take(1)
и он должен вызвать getPost
один раз.
Если я использую map
, поток работает ленивым, звонит getPost
один раз. Если я использую flatmap
, он вызывает getPost
для всех номеров.
var lazyStream = Bacon.fromArray([1, 2, 3, 4]).map(function(value) {
return Bacon.fromPromise(getPost(value));
});
var nonLazyStream = Bacon.fromArray([1, 2, 3, 4]).flatMap(function(value) {
return Bacon.fromPromise(getPost(value));
});
lazyStream.take(2).log();
//nonLazyStream.take(2).log();
Однако map
возвращает обещание, в то время как flatMap
возвращает сам пост. Как у меня есть ленивый поток, который возвращает стоимость обещания?
@BenjaminGruenbaum, спасибо так много, что работает, я запутался, как/почему это работает, объяснение и/или будет принято альтернативное лучшее решение. Поскольку мне кажется, что «flatMapWithConcurrencyLimit» - побочный эффект, который решает эту проблему. – user3995789
Я добавил более подробную информацию, дайте мне знать, если теперь это яснее. –