angularjs - Coffeescript 和 AngularJS 中的隐式返回

标签 angularjs coffeescript

Coffeescript 中的以下虚拟 Controller :

GlobalTimelineController = ($scope, $http) ->
  $http.get('/api/globalTimeline').success (posts) ->
    $scope.posts = posts

编译为 Javascript,如下所示:

(function() {
  var GlobalTimelineController;

  GlobalTimelineController = function($scope, $http) {
    return $http.get('/api/globalTimeline').success(function(posts) {
      return $scope.posts = posts;
    });
  };

}).call(this);

我想知道 Coffee 编译器添加的这些 return 语句有什么副作用吗?正确性和性能都如何?

我应该关心这个以及方法和回调末尾的空返回吗?

最佳答案

$http.get 调用返回一个所谓的“promise”,其工作原理如下:

promise.success = function(fn) {
  promise.then(function(response) {
    fn(response.data, response.status, response.headers, config);
  });
  return promise;
};

取自 AngularJS 源代码 (/src/ng/http.js:700)

这意味着您的函数返回的任何内容都将被忽略,因此如果它是对象,则在您的函数完成后,对它的引用就会丢失。 因此,从正确性的 Angular 来看,这并不重要。

现在,如果我们看看性能,在这种情况下,差异(如果有的话)可以忽略不计。 但是,您始终需要牢记这种行为。如果您在函数中所做的最后一件事是执行一些具有多次迭代的循环,则 CoffeeScript 将返回一个由每个数组迭代的结果组成的大数组(数组理解)。不仅会影响性能,极端情况下还可能导致JS内存不足!

您还可以在末尾附加一个 return 语句,以防止 CoffeeScript 生成此类数组。

关于angularjs - Coffeescript 和 AngularJS 中的隐式返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18874695/

相关文章:

javascript - AngularJS "accordion"使用 ng-click 加载和卸载 DOM 元素

javascript - 在 AngularJS/TypeScript/ES6 中定义/访问拦截器时出现 TypeError

javascript - 根据 AngularJS 服务值的变化更新指令

javascript - 在 node.js 中使用数据库请求的结果

javascript - NodeJS 并发/异步生成 View 以提高性能

javascript - 根据 Angular 日期选择器中的第一个日期选择器更改第二个日期选择器中的月份

javascript - Angular js 输入模型在 Controller 内部无法访问

backbone.js - Backbone.js 模型中的数组本质上是静态的?

具有固定范围的 CoffeeScript 兼容 fork ?

javascript - CoffeeScript 匿名函数中的 '+' 符号是什么意思?