if-else flujo en promesa (bluebird)

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 locking.

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

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 

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(); }) 
    Intereting Posts