【问题标题】:Unwanted js code added while compiling coffeescript编译coffeescript时添加了不需要的js代码
【发布时间】: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。但是我已经编写了将所有数据推送到值 [] 的代码。因此,问题。

标签: javascript coffeescript


【解决方案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 只会做一些您不想要的奇怪的计时事情)。我的答案中的函数确实返回了对数组的承诺。有关详细信息,请参阅我链接的问题。
猜你喜欢
  • 2012-04-21
  • 1970-01-01
  • 2021-11-27
  • 2011-07-08
  • 2012-08-04
  • 2022-01-16
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多