我不是那么有经验/优雅的程序员。我希望我的问题是可以理解的。
我一生中大部分时间都在使用java/c++,所以我的思想是面向对象的。然后我学习了Python,我非常喜欢函数式思维。现在我正在接近js。它具有挑战性,因为它是基于函数的(我非常喜欢它)、函数式的(带下划线的,我有很多 pythonic iterutils
方法)和异步的(这很伤人)。
很多时候我有一些后端同步程序流程,例如:
if exist(user):
foo(user)
# ok
else:
add(user)
# user added
现在我必须用所谓的回调 hell 来处理这个问题:
exists(user, function(userExist) {
if( userExist ) {
foo( user, function(fooResult) {
/* ok */
});
} else {
add( user, function(addResult) {
/* user added */
});
}
});
有时控件更加嵌套:检查 token ,如果 token 有效则检查用户是否存在,如果用户存在则检查有效参数,然后检查用户的 foo 中是否有错误,等等...
这些控件只是同步且类似命令式的。没什么可说的。虽然使用像 python 这样的同步语言,我可以使用返回值的小函数来处理这是(不优雅但至少)可读的代码,而使用 javascript 我不知道如何在可读的小函数中重构内容。我编写的所有函数都没有任何 return
语句,只有 callback(something_weird_define_in_caller_function)
,我迷失了自己。
我不认为 promise 对我的情况有好处,因为更多的是用于管道事件,IIUC。所以我正在寻找一些使用 async
库的模式来处理这种情况:
- 仅当前一个函数成功时才继续执行系列函数。
请提供任何帮助,我们将不胜感激。
最佳答案
I don't think that promises are good on my case because are more for piping events, IIUC
没有。 Promise 并不代表要通过管道传输的事件流,而是稍后(异步)到达的单个结果。这正是它们的用途,它们将为您提供类似命令式的代码(而不是嵌套回调 hell )。
诚然,you still need nesting for control structures 。除了进入 .then()
的回调之外,您提供的代码看起来不会有太大不同。来电,并 promise return
编辑。
但是,您也可以use exceptions for control flow 。而不是使用 exists
返回 Promise<boolean>
,您可以使用 find
返回 Promise<User>
的函数当用户不存在时会被拒绝。它可以像这样使用
find(user).then(function(/*user*/) {
return foo(user) /* .then(function(fooResult) {
…
}); */
}).catch(UserNotFoundError, function(e) {
return add(user) /* .then(function(addResult) {
…
}); */
});
选择哪一个是有争议的,rejections should be exceptional .
关于javascript - 使用异步库寻找 if then else 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24954797/