これは私のコードの短いバージョンです。
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
しかし、私はノンブロッキングソリューションを探しています。
あなたが探していると思う
(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();
});
ここでの他の提案は機能しますが、個人的には次のことを好みます。
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()関数の内部。
常に 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();
})