web-dev-qa-db-ja.com

約束のif-elseフロー(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しかし、私はノンブロッキングソリューションを探しています。

39
vinayr

あなたが探していると思う

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

ここでの他の提案は機能しますが、個人的には次のことを好みます。

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

常にこの追加の約束を作成するというデメリット(むしろマイナーなIMO)がありますが、私の目にはずっときれいに見えます。また、IIFE内に他の条件/ロジックを簡単に追加できます。

[〜#〜] edit [〜#〜]

このようなものを長い間実装した後、私は間違いなく少し明確なものに変更しました。最初の約束は関係なく作成されるので、単純に行う方がはるかに明確です:

/* 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()関数の内部。

9
Goblinlord

常に 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();
})
2
aarosil