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