编译coffeescript时添加了不需要的js代码

Posted

技术标签:

【中文标题】编译coffeescript时添加了不需要的js代码【英文标题】:Unwanted js code added while compiling coffeescript 【发布时间】:2014-10-22 06:42:11 【问题描述】:

我是 coffeescript 的新手,我有一个咖啡脚本代码

getProviderListDisplayValues:(domainId) ->      
    displayValues = []
    $.ajax 
        contentType: 'application/json',
        url: "/Services/ListProviders?domainid=#domainId",
        success: (data) ->          
            for oneResponse in data
                displayValues.push oneResponse.name     
    displayValues

编译成

CounselorHome.prototype.getProviderListValues = function(domainId) 
   var values;
   values = [];
   $.ajax(
     contentType: 'application/json',
     url: "/Services/ListProviders?domainid=" + domainId,
     success: function(data) 
       var oneResponse, _i, _len, _results;
       _results = [];
       for (_i = 0, _len = data.length; _i < _len; _i++) 
         oneResponse = data[_i];
         _results.push(values.push(oneResponse.id));
       
       return _results;
     
   );
   return values;
;

我只想将值推送到 values[]displayValues[] 但为什么要创建 _results[] 数组?它会影响浏览器的效率吗?有什么办法可以删除这种不必要的代码吗?可能是,通过编辑我的咖啡脚本。

编辑:工作条件

但是当我把警报代码设置为

 $.ajax 
        contentType: 'application/json',
        url: "/Services/ListProviders?domainid=#domainId",
        success: (data) ->          
            for oneResponse in data
                displayValues.push oneResponse.name     
 alert displayValues
 displayValues

此代码有效,我可以检索所需的数据。

【问题讨论】:

ajaxasynchronous 所以我认为您正在尝试做一些无法按预期工作的事情。看起来咖啡注意到了这一点,因此永远不会以可引用的方式给你_results 是的,在重新使用 values[] 时,它会为 Google Chrome 返回 undefined,而为 FireFox 返回 null。但是我已经编写了将所有数据推送到值 [] 的代码。因此,问题。 【参考方案1】:

除了your code wouldn't work anyway,_results 是由于咖啡脚本隐式函数返回值而生成的 - 以及loops are only expressions 以及生成数组。文档状态:

有时函数以循环结束,这些循环旨在仅出于副作用而运行。小心你不会意外返回 在这些情况下的理解结果,通过添加 有意义的返回值——比如true——或者null,到底部 你的功能。

所以你期望的javascript可以通过编写来创建

…
    success: (data) ->
        for oneResponse in data
            displayValues.push oneResponse.name
        return
…

("尾随 returnreturn undefined 现在已被优化掉。" - 从 1.0.1 版开始); 另见Is there any way to not return something using CoffeeScript?

然而,你真正想要的是这样的:

getProviderListDisplayValues:(domainId) ->
    $.ajax
        contentType: 'application/json',
        url: "/Services/ListProviders?domainid=#domainId"
    .then (data) ->          
        for oneResponse in data
            oneResponse.name

…

getProviderListDisplayValues(…).then (displayValues) ->
    …

【讨论】:

我对 不会按预期工作而不是 无论如何都不会工作有点不那么强大,因为 OP 的代码没有实际上破坏了对displayValues 的引用(直到它被转换),这意味着在成功 之后,它应该被填充。只是没有让脚本的其余部分知道成功功能已经完成......以及咖啡的转换。 @PaulS.:是的,这使得displayValues 数组无法使用——我非常大胆,因为我希望 OP 在数组返回后立即使用它。这个错误太常见了:-/ 如果是这样,如何填充values[],因为我需要返回一个数组? 您无法返回从函数异步获取的数组。这是不可能的(并且在您的编辑中使用alert 只会做一些您不想要的奇怪的计时事情)。我的答案中的函数确实返回了对数组的承诺。有关详细信息,请参阅我链接的问题。

以上是关于编译coffeescript时添加了不需要的js代码的主要内容,如果未能解决你的问题,请参考以下文章

ruby on rails 中的 Coffeescript 编译错误

将 CoffeeScript 文件编译成一个 js 文件

CoffeeScript中对于在NetBeans 8.0插件:设置目标文件夹JS编译

在保存时编译 CoffeeScript?

用JavaScript编写的CoffeeScript

Rails 啥时候编译 CoffeeScript?