javascript - 使用异步库寻找 if then else 模式

标签 javascript asynchronous conditional-statements promise

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

我一生中大部分时间都在使用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/

相关文章:

javascript - child UL 对父亲 LI 动画的奇怪行为

异步执行功能App脚本

AngularJS:ng-如果 bool 条件不起作用?

javascript - 如何在 Javascript 中构造一个新类型?

javascript - 堆的算法返回数组而不是打印

javascript - 如何避免 UI5 中的 "Synchronous XMLHttpRequest on the main thread"警告?

python - Python 中的协程与 Lua 中的协程相比如何?

javascript - 如何理解 "if ( obj.length === +obj.length )"Javascript条件语句?

ruby-on-rails - Rails created_at 查找条件

javascript - 默认情况下,HTML5 Canvas 会在屏幕外呈现吗?