Fluxo if-else na promise (bluebird)

Esta é uma versão curta do meu 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 as condições chamam a functionA . Existe maneira de evitar outra condição? Eu posso fazer fs.writeFileSync mas estou procurando uma solução sem bloqueio.

Eu acho que você está procurando

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

que é curto para

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

Enquanto outras sugestões aqui funcionam, pessoalmente eu prefiro o seguinte.

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

Ele tem a desvantagem de sempre criar essa promise adicional (um pouco menor que a IMO), mas parece muito mais limpo aos meus olhos. Você também pode adicionar outras condições / lógica facilmente dentro do IIFE.

EDITAR

Depois de implementar coisas como esta por um longo tempo agora eu definitivamente mudei para algo um pouco mais claro. A promise inicial é criada independentemente, por isso é muito mais simples simplesmente fazer:

 /* 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 

Você sempre pode usar Promise.all() com function 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 }) 

Ou, se quiser que a functionA chamada apenas depois que o arquivo foi escrito, você pode separar:

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