if-else流入承诺(蓝鸟)

时间:2014-10-28 02:05:25

标签: node.js promise bluebird

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

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但我正在寻找一种非阻塞解决方案。

3 个答案:

答案 0 :(得分:61)

我认为你正在寻找

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

答案 1 :(得分:9)

虽然此处的其他建议有效,但我个人更喜欢以下内容。

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

它的缺点是总是创造这个额外的承诺(相当小的IMO),但看起来更清洁。您还可以在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
实际上,在你的情况下,它只是

if (someCondition) return somePromise;

在第一个.then()函数内部。

答案 2 :(得分:2)

您始终可以将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();
})