存在性检查后没有隐式 return?

No implicit return after existential check?

以下代码:

db.query QUERY
    .then (val, err) ->
        if err?
            err
        else
            #process and return value

编译为:

db.query(QUERY).then(function(val, err) {
    var arr; //various other var declarations
    if (err != null) {
        err; //useless expression!
    } else {
       //do stuff
    }
});

我必须在原始 coffeescript 的第 4 行添加一个明确的 return err 以获得所需的行为......我期待明确的 return。我将 coffeescript 1.8 与 pgpromise 模块一起使用。 那么为什么编译器输出一个无用的语句而不是隐式 returning 错误对象(如果存在)呢?我在文档或堆栈溢出中找不到任何关于此行为的内容,google 搜索出现的所有内容都与如何 prevent implicit returns 有关,而不是当它失败时。

编辑:根据本杰明·格鲁恩鲍姆 (Benjamin Gruenbaum) 在下面的回答,这是我打算编写的语义上有效的代码。它解决了这个问题。我把它贴在这里以防其他人偶然发现这个并且也在滥用承诺:

db.query(QUERY).then(
    (val) ->
        #handle value
    , (err) ->
        #handle err
)

您使用的承诺有误。 Promises 不会使您的生活变得复杂 - 就像同步代码一样,您有 return 用于正常流量控制的语句和 throw 用于异常流量控制的语句。

就像函数 return 一样,只有一个值 - then 有一个参数。异常错误处理在异常(称为拒绝)中完成。

在同步代码中,您将拥有:

try{  
  var val = db.query(QUERY);
  var arr; // various other var declarations
  // do stuff
} catch(e){
    // handle exception
}

承诺翻译为:

db.query(QUERY).then(function(val) {
    var arr; //various other var declarations
    //do stuff
}).catch(function(err){
    // handle rejections (which are exceptions conceptually)
});

再次遇到问题并解决了。把这个留在这里以防其他人偶然发现同样的问题。我切换到一个新的编辑器,但没有意识到它默认为自动缩进的硬制表符。 coffeescript 编译器显然会被制表符和空格的混合抛出并跳过隐式的 return,这意味着如果你没有明确地 return,你就会搁浅最后一行的任何表达式。通过切换到软选项卡修复它。