我没有那么有经验/优雅的程序员。我希望我的问题是可以理解的。
我在生活的大部分时间里都使用过java / c ++,所以我的思想是面向对象的。然后我学会了python,我非常喜欢功能性的头脑。现在我正在接近js。这是具有挑战性的,因为它是基于功能的(我非常喜欢它),功能性(使用下划线我有很多pythonic iterutils
方法)和异步(它很痛)。
很多时候我有一些后端同步程序流程如下:
if exist(user):
foo(user)
# ok
else:
add(user)
# user added
现在我必须用所谓的回调地狱处理这个问题:
exists(user, function(userExist) {
if( userExist ) {
foo( user, function(fooResult) {
/* ok */
});
} else {
add( user, function(addResult) {
/* user added */
});
}
});
有时控件更嵌套:检查令牌,如果令牌有效则检查用户是否存在,如果用户存在则检查有效参数,然后检查用户foo中是否有错误等等...
这些控制只是同步和命令式的。没什么好说的。虽然使用像python这样的同步语言我可以处理这是(不优雅但至少)可读的代码,使用返回值的小函数,使用javascript我不知道如何在可读的小函数中重构事物。我写的所有函数都没有任何return
语句,只有callback(something_weird_defined_in_caller_function)
而且我迷失了自己。
我不认为我的承诺是好的,因为更多的是管道活动,IIUC。所以我正在使用async
库寻找一些模式来处理这种情况:
- 只有在前一个函数成功的情况下才继续执行系列函数。
请提供任何帮助。
答案 0 :(得分:1)
我不认为承诺对我的情况有好处,因为更多的是管道事件,IIUC
没有。 Promise不代表管道事件流,而是单个结果,它将在稍后(异步)到达。这是完全它们的用途,它们将为您提供类似命令的代码(而不是嵌套回调地狱)。
不可否认,you still need nesting for control structures。除了进入.then()
次调用的回调以及承诺为return
之外,您提供的代码不会有太大的不同。
但是,您也可以use exceptions for control flow。您可以使用返回exists
的{{1}}函数,而不是使用返回Promise<boolean>
的{{1}}函数,该函数会在用户不存在时被拒绝。它可以像
find
选择哪一个是值得商榷的,rejections should be exceptional。