gpt4 book ai didi

javascript - 将流映射到惰性 promise 流

转载 作者:搜寻专家 更新时间:2023-10-31 23:54:24 25 4
gpt4 key购买 nike

我有一个我有一个数字流,我必须使用 promise 将它们变成一个帖子流。我想懒惰地做这件事。因此,如果我从帖子流中执行 .take(1),它只会将一个数字变成一个帖子。

这是从数字中获取帖子的 promise :

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 返回一个 promise ,而 flatMap 返回帖子本身。我如何拥有返回 promise 值的惰性流?

最佳答案

flatMap一次获取由 promise 创建的所有流,并一次使用所有流生成一个新流。 Live 你已经观察到这不是懒惰的,并且会立即调用所有的 promise 返回函数。

你希望一次发生一个,所以你应该使用 flatMapConcat .它不会一次获取所有流,而是一次一个地调用它们,一个一个地调用 promise ——这是您通常期望 .flatMap 在其他一些 FRP 库中执行的操作。请注意,这概括了使用 flatMapWithConcurrencyLimit如果您需要它一次执行 n

这是一个使用 flatMapConcat 的例子对于类似的情况:

function delayPromise(val){ // delayed promise simulating an async request
return new Promise(function(resolve){
setTimeout(function(){ console.log("Resolve timeout"); resolve(val); }, 500);
});
}

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

stream.take(1).log();

Fiddle link

关于javascript - 将流映射到惰性 promise 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27657538/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com