1

我的問題是有點關心概念。Javascript - 如果異步情況下

很多時候,有這樣的這樣的情況:

if(something){ 
    someAsyncAction(); 
}else{ 
    someSyncAction(); 
} 

// Continue with the rest of code.. 
var a = 5; 

與此這種情況下的問題是清楚的,我不希望var a = 5要打電話,除非someAsyncAction()someSyncAction()會做,現在,事業soAsyncAction()是異步的唯一方法(我能想到的)來解決這個情況是類似的東西:

var after = function(){ 
    // Continue with the rest of code.. 
    var a = 5; 
} 

if(something){ 
    someAsyncAction(after); 
}else{ 
    someSyncAction(); 
    after(); 
} 

,但是這個代碼是醜陋的,難以閱讀和看起來像反模式和問題。

我想也許我可以找到一些與承諾(在後端使用藍鳥)的解決方案,但找不到東西。

有人曾經遇到過這種情況,可以幫我弄清楚嗎?

謝謝!

+1

與AsyncAction和SyncAction混淆看起來像反模式。 – xdazz

+0

如果需要,可能會變醜,但是定義並使用javascript回調的方式。我不知道任何其他方式異步工作。哦,它根本不是反模式,這是模式。 – Bolza

+0

@xdazz。異步和同步非常受歡迎,例如:'if(!modelAlreadyExist) loadItAsyncFromDb() else useTheCurrentOneSync()' –

回答

4

有了承諾,你將有一個類似的模式與回調,只有你會先存儲結果,而不必調用/傳遞迴調兩次:

function after(result) { 
    // Continue with the rest of code.. 
    var a = 5; 
} 
var promise; 
if (something){ 
    promise = someAsyncAction(); 
} else { 
    promise = Promise.resolve(someSyncAction()); 
} 
promise.then(after); 

或者總之,你會使用條件運算符和結構更直截了當:

(something 
    ? someAsyncAction() 
    : Promise.resolve(someSyncAction()) 
).then(function(result) { 
    // Continue with the rest of code.. 
    var a = 5; 
}); 
+0

我剛纔瞭解到,三元運算符也稱爲條件運算符。另一方面,一旦'yield'運算符得到廣泛支持,'result = something?產生someAsyncAction():someSyncAction()'只要在託管的生成器上下文中調用就可以。 – plalx

+0

@plalx:'yeld'關鍵字的含義與python中的相同,用於創建生成器? – Cristik

+0

@Cristik它將被用來創建生成器,是的。 – plalx

相關問題