以下代码:
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
来获得所需的行为......我期待明确的回归。我正在使用带有pg
和promise
模块的coffeescript 1.8。
那么为什么编译器输出一个无用的语句而不是隐式返回错误对象(如果存在)?我在文档或堆栈溢出中找不到的任何内容都说明了这种行为,谷歌搜索出现的所有内容都与如何阻止隐式返回相关,而不是在失败时。
db.query(QUERY).then(
(val) ->
#handle value
, (err) ->
#handle err
)
答案 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编译器显然被混合的制表符和空格抛出并跳过隐式返回,这意味着如果你没有显式地返回你的最后一行表达式。通过切换到软标签来修复它。