if-elsestream入promise(蓝鸟)

这是我的代码的简短版本。

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

这两个条件都调用functionA 。 有没有办法避免其他条件? 我可以做fs.writeFileSync但我正在寻找一个非阻塞的解决scheme。

我想你在找

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

这是简短的

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

虽然其他build议在这里工作,我个人更喜欢以下。

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

它的缺点是总是创造这个额外的承诺(相当小的国际海事组织),但看起来更清洁。 您也可以在IIFE中轻松添加其他条件/逻辑。

编辑

在实施这样的事情很长一段时间后,我已经明确地改变了一些更清楚的事情。 最初的承诺是无论如何都创造出来的,简单的做法就更清楚了:

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

你总是可以使用Promise.all()和条件函数

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

或者,如果你想要functionA只在文件被写入后调用,你可以分开:

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