【问题标题】:Looking for if then else pattern with async library使用异步库寻找 if then else 模式
【发布时间】:2014-09-17 06:04:33
【问题描述】:

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

我大部分时间都在使用 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),我迷失了自己。

我不认为 promise 对我的情况有好处,因为更多的是用于管道事件,IIUC。所以我正在寻找一些使用async 库来处理这种情况的模式: - 只有在前一个成功的情况下才能继续执行一系列函数。

如有任何帮助,我们将不胜感激。

【问题讨论】:

  • 就是承诺的用途。该事件是对异步调用的响应。

标签: javascript asynchronous conditional-statements promise


【解决方案1】:

我不认为 promise 对我的情况有好处,因为更多的是用于管道事件,IIUC

没有。 Promise 不代表要传递的事件流,而是稍后(异步)到达的单个结果。这正是它们的用途,它们将为您提供类似命令式的代码(而不是嵌套回调地狱)。

诚然,you still need nesting for control structures。除了进入.then() 调用的回调和returned 的承诺之外,您提供的代码看起来并没有太大不同。

不过,您也可以use exceptions for control flow。除了使用返回Promise<boolean>exists 之外,您还可以使用返回Promise<User>find 函数,当用户不存在时该函数将被拒绝。可以这样使用

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

【讨论】:

    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多