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,没错。生成器可用于创建异步运行的“协同路由”。请参阅以获取解释