2014-10-28 10 views
36

. Her iki koşul da, functionA numaralı telefonu arayabilir. Başka bir durumdan kaçınmanın bir yolu var mı? fs.writeFileSync yapabilirim ancak engelleme olmayan bir çözüm arıyorum.Bu benim kısa bir kod versiyonu if-else vaadi (bluebird) akış

+0

Söz, async görev denetimi için tasarlanmıştır. Neden sync fucntion kullanmalı? 'WriteFileAsync''in dönüş değerini kontrol edebilirsiniz. – CodeColorist

cevap

52

Ben size functionA isterseniz her zaman, koşullu fonksiyonu

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

ile Promise.all() kullanmak Veya olabilir

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

kısaltmasıdır

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

aradığınız düşünüyorum sadece dosyadan sonra çağrılabilir belki de yazılabilir:

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

Bu yaklaşımla My * only * issue sürekliliğidir. Çizgiyi aşmak zorunda kaldığın için kendini imzala. Promise zincirlerinin faydalarından biri olan - mantığınız doğrusal bir duygudur. –

7

Diğer öneriler burada çalışırken, kişisel olarak aşağıdakileri tercih ediyorum.

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

Her zaman bu ek sözünü (ziyade minör IMO) yaratma dezavantajına sahiptir ama benim göz daha temiz görünüyor. Ayrıca IIFE'nin içinde kolayca başka koşullar/mantık da ekleyebilirsiniz.

DÜZENLEME

uzun süre bu gibi şeyler uyguladıktan sonra artık kesinlikle biraz daha net bir şey değişti. o çok nettir böylece ilk söz basitçe yapmak bakılmaksızın oluşturulur:

/* 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
Aslında , senin durumunda sadece

if (someCondition) return somePromise; 

ilk .sonra içinde olacağını() işlevi.