函数中的函数返回

CoffeeScript Return on Functions Within Functions

本文关键字:函数 返回      更新时间:2023-09-26

我是一个业余爱好者,用CoffeeScript、Jade和Stylus(类似于这个)来研究《Discover Meteor》。

我遇到了一段代码,我不能得到编译成适当的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以避免这种情况继续下去?

我认为问题在于最后一个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。咖啡,这个片段编译成:

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
            });
        });
    }
});

我想这就是你要找的。

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