【问题标题】:Javascript - if with asynchronous caseJavascript - 如果使用异步情况
【发布时间】:2015-06-30 09:23:14
【问题描述】:

我的问题有点关于概念。

很多时候都有这样的情况:

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

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

这种情况的问题很明显,我不希望调用var a = 5,除非someAsyncAction()someSyncAction() 现在可以完成,因为soAsyncAction() 是异步的唯一方法(我认为of) 来解决这种情况是这样的:

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

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

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

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

有没有人遇到过这个问题并且可以帮助我解决这个问题?

谢谢!

【问题讨论】:

  • 混乱的 AsyncAction 和 SyncAction 在我看来也是反模式。
  • 如果你愿意,可能会很丑,但它是定义和使用 javascript 回调的方式。我不知道任何其他异步工作的方式。哦,这根本不是反模式,这就是模式。
  • @xdazz。 Async and Sync 很流行,例如:if(!modelAlreadyExist) loadItAsyncFromDb() else useTheCurrentOneSync()
  • @bolza,你可以用 JavaScript 做某事并不意味着它没问题,就像其他所有语言一样,JavaScript(和其他异步语言)的问题,很多人在没有它的情况下编写它非常难看以后有机会调试它..这就是为什么模式在这里如此重要..见下面Bergi的回答,就是这样!
  • 这是一个非常相关的问题/答案,可能重复:Return value from asynchronous OR synchronous JavaScript request

标签: javascript design-patterns asynchronous promise anti-patterns


【解决方案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;
});

【讨论】:

  • 我刚刚了解到三元运算符也称为条件运算符。另一方面,一旦yield 运算符得到广泛支持,result = something? yield someAsyncAction() : someSyncAction() 只要在托管生成器上下文中调用就可以实现。
  • @plalx:yeld关键字会不会和python中的意思一样,在哪里用来创建生成器?
  • @Cristik 它将用于创建生成器,是的。
  • @Cristik:是的,完全正确。生成器可以(ab)用于创建异步运行的“协程”。请参阅here 了解说明
猜你喜欢
  • 1970-01-01
  • 2013-11-18
  • 2021-12-19
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 2013-07-22
相关资源
最近更新 更多