tabla secuencias secuencia postgres modificar consultar asociar asignar javascript node.js promise bacon.js

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();

Enlace violín