CoffeeScript 返回函数内的函数

Posted

技术标签:

【中文标题】CoffeeScript 返回函数内的函数【英文标题】:CoffeeScript Return on Functions Within Functions 【发布时间】:2015-12-12 01:46:00 【问题描述】:

我是一名爱好者,正在研究使用 CoffeeScript、Jade 和 Stylus 编写的 Discover Meteor 一书(类似于 this)。

我遇到了一段无法编译成正确 javascript 的代码。我的咖啡是这样的:

Template.postSubmit.events
 'submit form': (e) ->
   e.preventDefault()
   post =
    url: $(e.target).find('[name=url]').val()
    title: $(e.target).find('[name=title]').val()
   Meteor.call 'postInsert', post, (error,result) ->
    if error
     return alert(error.reason)
    Router.go('postPage', _id: result.id)
   return

编译成这样:

Template.postSubmit.events(
  'submit form': function(e) 
    var post;
    e.preventDefault();
    post = 
      url: $(e.target).find('[name=url]').val(),
      title: $(e.target).find('[name=title]').val()
    ;
    Meteor.call('postInsert', post, function(error, result) 
      if (error) 
        return alert(error.reason);
      
      return Router.go('postPage', 
        _id: result.id
      );
    );
  
);

根据书,最后的“return”(在“Router.go”旁边)不属于代码。其他一切似乎都是正确的。我尝试了多种方法来重写我的 CoffeeScript,但都没有成功。我知道 Coffee 在所有函数的最后一行自然地插入了一个返回,但是我没有成功返回空返回或我见过的任何其他建议。我想知道的是:额外的返回是否会干扰代码的执行,以及如何更好地编写我的 CoffeeScript 来避免这种情况发生?

【问题讨论】:

【参考方案1】:

我认为问题在于最后一个 return 语句的缩进。

这是您所拥有的(有 4 个缩进空格,因此您可以更好地看到差异):

Template.postSubmit.events
    'submit form': (e) ->
        e.preventDefault()
        post =
            url: $(e.target).find('[name=url]').val()
            title: $(e.target).find('[name=title]').val()
        Meteor.call 'postInsert', post, (error,result) ->
            if error
                return alert(error.reason)
            Router.go('postPage', _id: result.id)
        return # this is the return that is the problem

使用这样的代码,Router.go 是对Meteor.call 的回调中的最后一条语句,因此,该表达式的结果从回调中返回。

我想你想要的是这样的:

Template.postSubmit.events
    'submit form': (e) ->
        e.preventDefault()
        post =
            url: $(e.target).find('[name=url]').val()
            title: $(e.target).find('[name=title]').val()
        Meteor.call 'postInsert', post, (error,result) ->
            if error
                return alert(error.reason)
            Router.go('postPage', _id: result.id)
            return # now indented farther!

现在最后的return 是回调中的最后一条语句,它在Router.go 语句之后执行。根据js2.coffee,这个片段编译为:

Template.postSubmit.events(
    'submit form': function(e) 
        var post;
        e.preventDefault();
        post = 
            url: $(e.target).find('[name=url]').val(),
            title: $(e.target).find('[name=title]').val()
        ;
        return Meteor.call('postInsert', post, function(error, result) 
            if (error) 
                return alert(error.reason);
            
            Router.go('postPage', 
                _id: result.id
            );
        );
    
);

我认为,这正是您要寻找的。​​p>

关于您的其他问题:“它会干扰我的代码吗?”它可能。 Meteor.call 将在(可能)调用完成时调用您的回调。它可能会对回调的结果做一些事情,所以你从回调中返回的内容可能会对你的应用程序产生很大的影响。 Meteor 的 API 应该说明从这个回调和其他回调中返回什么值。

【讨论】:

完美,缩进确实是问题所在。我不得不再添加一个“return”来摆脱“Meteor.call”前面的“return”,否则这解决了它。非常感谢。

以上是关于CoffeeScript 返回函数内的函数的主要内容,如果未能解决你的问题,请参考以下文章

coffeescript 函数 箭头表达式

无法在 module.exports 内的 promise 函数中返回解析

从另一个返回对象内的函数的返回对象中构造变量

如何打破递归函数内的 for 循环并在 Javascript 中返回?

七.Excel统计函数

javascript 匿名函数