函数中的函数返回
CoffeeScript Return on Functions Within Functions
我是一个业余爱好者,用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应该说明从这个回调和其他回调返回什么值。
相关文章:
- ES6构造函数返回基类的实例
- 从函数返回角度承诺
- 如何从jquery函数返回变量
- 根据是否解析了 Promise 从函数返回值
- Javascript函数返回未定义
- 如果函数返回True,则显示Javascript按钮
- Google Sheet自定义函数返回0
- 从Ajax函数返回值
- 使用for循环从Javascript中的函数返回多个值
- 谷歌地图:函数返回未定义的值在console.log中运行良好
- 从函数中的函数返回数组时出错
- 如何从嵌套的API函数返回值
- 从Mongoose结果匿名函数返回父函数
- 函数返回错误'令牌{'
- Jquery函数返回订单问题
- Mocha/Chai测试链接到函数返回断言错误
- 从异步函数返回值
- 函数返回后更新变量
- 我如何才能继续'如果'语句来比较作为参数的多个函数返回值
- 将外部函数返回的id传递给内部函数