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

相关问题