编译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
此代码有效,我可以检索所需的数据。
【问题讨论】:
ajax 是 asynchronous 所以我认为您正在尝试做一些无法按预期工作的事情。看起来咖啡注意到了这一点,因此永远不会以可引用的方式给你_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
…
("尾随 return
和 return 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 编译错误