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