trabajar promesas promesa platzi example encadenamiento con anidadas node.js promise bluebird

node.js - promesas - promise javascript example



if-else flujo en promesa(bluebird) (3)

Creo que estás buscando

(conditionA ? fs.writeFileAsync(file, jsonData) : Promise.resolve()) .then(functionA);

que es la abreviatura de

var waitFor; if (conditionA) waitFor = fs.writeFileAsync(file, jsonData); else waitFor = Promise.resolve(undefined); // wait for nothing, // create fulfilled promise waitFor.then(function() { return functionA(); });

Esta es una versión corta de mi código.

var Promise = require(''bluebird''); var fs = Promise.promisifyAll(require("fs")); if (conditionA) { fs.writeFileAsync(file, jsonData).then(function() { return functionA(); }); } else { functionA(); }

Ambas condiciones llaman functionA . ¿Hay forma de evitar otra condición? Puedo hacer fs.writeFileSync pero estoy buscando una solución sin bloqueo.


Si bien otras sugerencias aquí funcionan, personalmente prefiero lo siguiente.

Promise.resolve(function(){ if (condition) return fs.writeFileAsync(file, jsonData); }()) .then()

Tiene la desventaja de crear siempre esta promesa adicional (más bien IMO de menor importancia) pero se ve mucho más limpio a mi vista. También puede agregar otras condiciones / lógica fácilmente dentro de IIFE.

EDITAR

Después de implementar cosas como esta durante mucho tiempo, definitivamente me he cambiado a algo un poco más claro. La promesa inicial se crea independientemente, por lo que es mucho más claro simplemente hacer:

/* Example setup */ var someCondition = (Math.random()*2)|0; var value = "Not from a promise"; var somePromise = new Promise((resolve) => setTimeout(() => resolve(''Promise value''), 3000)); /* Example */ Promise.resolve() .then(() => { if (someCondition) return value; return somePromise; }) .then((result) => document.body.innerHTML = result);

Initial state

En realidad, en tu caso sería simplemente

if (someCondition) return somePromise;

dentro de la primera función .then ().


Siempre Promise.all() usar Promise.all() con función condicional

var condition = ...; var maybeWrite = function(condition, file, jsonData){ return (condition) ? fs.writeFileAsync(file, jsonData) : Promise.resolve(true); } Promise.all([maybeWrite(condition, file, jsonData),functionA()]) .then(function(){ // here ''functionA'' was called, ''writeFileAsync'' was maybe called })

O bien, si desea llamar a functionA solamente después de que se haya escrito el archivo, puede separar:

maybeWrite(condition, file, jsonData) .then(function(){ // here file may have been written, you can call ''functionA'' return functionA(); })