javascript - secuencias - postgresql sequence nextval
asociar una secuencia a una secuencia de promesa lenta (1)
Tengo un flujo de números, tengo que convertirlos en una secuencia de publicaciones usando una promesa. Y quiero hacer esto perezosamente. Entonces, si .take(1)
de la transmisión de la publicación, solo convertirá un número en una publicación.
Esta es la promesa que recibe una publicación de un número:
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);
});
};
Solo me interesa la primera publicación, así que take(1)
, y debería llamar a getPost
una vez.
Si utilizo el map
, la transmisión funciona de manera diferida, las llamadas a getPost
una vez. Si uso flatmap
, llama a getPost
para todos los números.
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();
Sin embargo, el map
devuelve una promesa, mientras que flatMap
devuelve la publicación en sí. ¿Cómo tengo un flujo lento que devuelve el valor de la promesa?
flatMap
toma todas las secuencias creadas por las promesas a la vez y genera una nueva secuencia usando todas las secuencias a la vez. En vivo, ha observado que esto no es perezoso y llamará a todas las funciones de retorno de la promesa a la vez.
Desea que eso suceda uno a la vez, por lo que debe usar flatMapConcat
. En lugar de tomar todas las transmisiones a la vez, las llamará de a una por vez e invocará las promesas una por una: esto es lo que normalmente esperaría .flatMap
en otras bibliotecas de FRP. Tenga en cuenta que esto generaliza el uso de flatMapWithConcurrencyLimit
si alguna vez lo necesita hacer n
a la vez.
Aquí hay un ejemplo usando flatMapConcat
para un caso similar:
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();