我是一个爱好者,通过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
});
});
}
});
根据这本书,最后的“返回”(在“Router.go”旁边)不属于代码。其他一切似乎都是正确的。我尝试了多种方法重写我的CoffeeScript而没有运气。我明白Coffee会自然地在所有函数的最后一行中插入一个返回,但是我没有成功获得空回报或我见过的任何其他建议。我想知道的是:额外的回报是否会干扰代码的执行,以及如何更好地编写我的CoffeeScript以避免这种情况发生?
答案 0 :(得分: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
语句之后执行。根据{{3}},这个片段编译为:
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应说明从此回调和其他回调中返回的值。