Javascript - 如果有异步情况

IT技术 javascript design-patterns asynchronous promise anti-patterns
2021-03-06 15:20:54

我的问题有点关于概念。

很多时候会出现这样的情况:

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

但是,这段代码很丑陋,难以阅读,看起来像反模式且有问题。

我想也许我可以通过 Promises(在后端使用 Bluebird)找到一些解决方案,但找不到一些东西。

有没有人以前遇到过这个问题,可以帮我弄清楚吗?

谢谢!

1个回答

使用Promise,您将拥有与回调类似的模式,只是您将首先存储结果,而不必两次调用/传递回调:

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;
});
@Cristik 它将用于创建生成器,是的。
2021-04-27 15:20:54
@plalx:yeld关键字是否与python中的含义相同,用于创建生成器的位置?
2021-05-02 15:20:54
@Cristik:是的,正是。生成器可以(ab)用于创建异步运行的“协程”。这里的解释
2021-05-04 15:20:54
我刚刚了解到三元运算符也称为条件运算符。另一方面,一旦yield操作符得到广泛支持,result = something? yield someAsyncAction() : someSyncAction()只要在托管生成器上下文中调用就可以了。
2021-05-11 15:20:54