如何避免在条件expression式中的coffeescript隐式“返回”?

我正在实现一个函数具有延迟值返回,并在函数内我有很多嵌套的条件expression式:

例如:

deferred = Q.defer() FS.readFile("foo.txt", "utf-8", (error, text) -> if error deferred.reject(new Error(error)) else deferred.resolve(text) ) return deferred.promise 

比将编译成:

 var deferred; deferred = Q.defer(); FS.readFile("foo.txt", "utf-8", function(error, text) { if (error) { --> return <-- deferred.reject(new Error(error)); } else { --> return <-- deferred.resolve(text); } }); return deferred.promise; 

我只需要最后一个返回,但不是if / else返回(即– >返回< –在编译的代码中)

我怎样才能避免coffeescript编译器这样的行为(不需要隐式返回)?

Coffeescript会自动返回最后一个expression式的结果,所以如果你不希望它返回if的结果,那么你需要添加另一个expression式。 在这种情况下,只需添加return

 FS.readFile "foo.txt", "utf-8", (error, text) -> if error deferred.reject new Error(error) else deferred.resolve text return 

此外, error已经是一个Error对象,所以你可以直接拒绝它。

 deferred.reject(error) 

你不能,确切地说。 你可以在不需要的时候忽略它们(这是最常见的事情),或者通过在函数的末尾添加一个额外的语句来提供一个明确的select。 我想在你的代码基础上一直试图这样做是为了打击一场你无法赢得的语言的战争,所以我个人的build议就是接受阿什肯纳斯先生隐含的回报,然后顺其自然。

 fs.readFile "foo.txt", "utf-8", (error, text) -> # postfix style if statement here avoids the else # of course, the value returned you may not like, so # you probably won't use this style, but my boilerplate for # error handling is # return callback(error) if error return deferred.reject(new Error(error)) if error deferred.resolve(text) # Here you can add an explicit return like return # or some other expression null # or 'this' in cases where chainability might be nice this # or so you don't accidentally delete this statement later thinking it is # useless return null 

这些forms中的任何一种都可以起作用,但实际上我并没有看到这些forms

我总是这样做:

 f = -> deferred = Q.defer() FS.readFile ..., ( error, text ) -> return deferred.reject error if error? deferred.resolve text return deferred.promise 

第一个return就是停止执行,而不是返回一个值。

在callback的最后一行,你仍然在JS中获得额外的(无意义的) return ; 为了避免这一点,插入一个额外的return null (或者如果你喜欢,就直接return )。

我不确定我喜欢CoffeeScript的隐式return插入; 可能会认为“显性比隐性好”。 也可以说,第一个return不应该是一个return而是另一个关键词,比如stopfinish或者其他。

作为一个无关的旁注,我在使用承诺时没有观察到任何明显的优势。 相反,我发现它们在我的代码中是非常侵入性的,那些在asynchronous编程之上的deferred和其他概念。