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