if-else flow in promise (bluebird)

Questa è una versione breve del mio codice.

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

Entrambe le condizioni chiamano functionA . C’è modo di evitare altre condizioni? Posso fare fs.writeFileSync ma sto cercando una soluzione non bloccante.

Penso che tu stia cercando

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

che è l’abbreviazione di

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

Mentre altri suggerimenti qui funzionano, personalmente preferisco il seguente.

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

Ha lo svantaggio di creare sempre questa promise aggiuntiva (IMO piuttosto minore) ma sembra molto più pulito ai miei occhi. È inoltre ansible aggiungere facilmente altre condizioni / logica all’interno dell’IIFE.

MODIFICARE

Dopo aver implementato cose come questa per molto tempo, ora ho decisamente cambiato qualcosa di leggermente più chiaro. La promise iniziale viene creata a prescindere, quindi è molto più semplice fare semplicemente:

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

Puoi sempre usare Promise.all() con la funzione condizionale

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

Oppure, se vuoi che functionA solo chiamato dopo che il file sia stato scritto puoi separare:

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