存在性检查后没有隐式 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 与 pg
和 promise
模块一起使用。
那么为什么编译器输出一个无用的语句而不是隐式 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,你就会搁浅最后一行的任何表达式。通过切换到软选项卡修复它。
以下代码:
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 与 pg
和 promise
模块一起使用。
那么为什么编译器输出一个无用的语句而不是隐式 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,你就会搁浅最后一行的任何表达式。通过切换到软选项卡修复它。