寻找if then else模式与异步库

时间:2014-07-25 11:31:59

标签: javascript asynchronous conditional-statements promise

我没有那么有经验/优雅的程序员。我希望我的问题是可以理解的。

我在生活的大部分时间里都使用过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库寻找一些模式来处理这种情况:   - 只有在前一个函数成功的情况下才继续执行系列函数。

请提供任何帮助。

1 个答案:

答案 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