存在性检查后没有隐含的回报?

时间:2015-01-23 12:26:12

标签: node.js coffeescript promise

以下代码:

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来获得所需的行为......我期待明确的回归。我正在使用带有pgpromise模块的coffeescript 1.8。 那么为什么编译器输出一个无用的语句而不是隐式返回错误对象(如果存在)?我在文档或堆栈溢出中找不到的任何内容都说明了这种行为,谷歌搜索出现的所有内容都与如何阻止隐式返回相关,而不是在失败时。

编辑:Per Benjamin Gruenbaum的答案如下,这是我打算编写的语义上有效的代码。它解决了这个问题。我已经在这里发布了以防万一其他人偶然发现这个并且也滥用了承诺:

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

2 个答案:

答案 0 :(得分:0)

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

就像函数返回单个值一样 - 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)
});

答案 1 :(得分:0)

再次遇到问题并弄清楚了。离开这里以防万一其他人偶然发现同样的问题。我切换到一个新的编辑器,并没有意识到它默认为自动缩进的硬标签。 coffeescript编译器显然被混合的制表符和空格抛出并跳过隐式返回,这意味着如果你没有显式地返回你的最后一行表达式。通过切换到软标签来修复它。