Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript-如果使用异步大小写_Javascript_Design Patterns_Asynchronous_Promise_Anti Patterns - Fatal编程技术网

Javascript-如果使用异步大小写

Javascript-如果使用异步大小写,javascript,design-patterns,asynchronous,promise,anti-patterns,Javascript,Design Patterns,Asynchronous,Promise,Anti Patterns,我的问题有点像概念 很多时候都会出现这种情况: if(something){ someAsyncAction(); }else{ someSyncAction(); } // Continue with the rest of code.. var a = 5; 这种情况的问题很明显,我不希望调用var a=5,除非someAsyncAction()或someSyncAction()将完成,因为soAsyncAction()是异步的解决这种情况的唯一方法(我能想到)是这样的:

我的问题有点像概念

很多时候都会出现这种情况:

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 ();
}
但是,这段代码很难看,很难阅读,看起来像反模式和有问题的

我试着想,也许我可以通过承诺(在后端使用Bluebird)找到一些解决方案,但找不到什么

以前有没有人面对过这个问题,能帮我解决这个问题


谢谢

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

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

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

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


AsyncAction和SyncAction的混乱在我看来也是反模式的。如果你愿意的话,可能会很难看,但这是定义和使用javascript回调的方式。我不知道其他异步工作的方法。哦,这根本不是反模式,这是模式。@xdazz。异步和同步非常流行,例如:
如果(!modelAlreadyExist)loadItAsyncFromDb()或者使用currentonesync()
@bolza,可以用JavaScript做一些事情并不意味着它可以,就像其他语言一样,JavaScript(和其他异步语言)的问题很多人写得很难看,没有机会在以后调试它。。这就是为什么模式在这里如此重要。。看下面Bergi的回答,就是这样!这里有一个非常相关的问题/答案和可能的重复:.AsyncAction和SyncAction的混乱在我看来也是反模式的。如果您愿意,可能会很难看,但这是定义和使用javascript回调的方式。我不知道其他异步工作的方法。哦,这根本不是反模式,这是模式。@xdazz。异步和同步非常流行,例如:
如果(!modelAlreadyExist)loadItAsyncFromDb()或者使用currentonesync()
@bolza,可以用JavaScript做一些事情并不意味着它可以,就像其他语言一样,JavaScript(和其他异步语言)的问题很多人写得很难看,没有机会在以后调试它。。这就是为什么模式在这里如此重要。。看下面Bergi的回答,就是这样!这里有一个非常相关的问题/答案和可能的重复:。我刚刚了解到三元运算符也称为条件运算符。另一方面,一旦
yield
操作符得到广泛支持,
result=something?生成someAsyncAction():someSyncAction()
只要在托管生成器上下文中调用就可以了。@plalx:yeld关键字的含义是否与python中用于创建生成器的位置相同?@Cristik它将用于创建生成器,是。@Cristik:yes,没错。生成器可用于创建异步运行的“协同路由”。关于解释,我刚刚了解到三元运算符也称为条件运算符。另一方面,一旦
yield
操作符得到广泛支持,
result=something?生成someAsyncAction():someSyncAction()
只要在托管生成器上下文中调用就可以了。@plalx:yeld关键字的含义是否与python中用于创建生成器的位置相同?@Cristik它将用于创建生成器,是。@Cristik:yes,没错。生成器可用于创建异步运行的“协同路由”。请参阅以获取解释