比如,我现在判断密码错误之后,我输入一个json,然后下面的代码就不执行了。按照我现在所熟知的方式就是直接在后面写一个return,
有没有像PHP一样的exit方法一样,直接结束掉当前后面的输入。因为,我写了一个公共方法来管理操作提示,在提示里面就结束掉当前的后面的代码执行。
比如,我现在判断密码错误之后,我输入一个json,然后下面的代码就不执行了。按照我现在所熟知的方式就是直接在后面写一个return,
有没有像PHP一样的exit方法一样,直接结束掉当前后面的输入。因为,我写了一个公共方法来管理操作提示,在提示里面就结束掉当前的后面的代码执行。
您可以使用this.Ctx.Abort
中止执行。
@pengfei-xue 你说的这个方法我试过了。它必须要求输入状态码和内容。而我只想在执行某个模板输出之后,就不执行后面的代码了。
我的代码如下: // 提示页面。 // @param Message 提示信息。 // @param Second 提示信息跳转前等待秒数。 // @param Url 跳转的URL。 func (this *IndexController) tip(Message string, Second int, Url string) { this.Data["Message"] = Message this.Data["Second"] = Second this.Data["Url"] = Url this.TplNames = "Public/tip.tpl" }
当我在其他Controller里面调用了tip方法的时候,调用的Controller在调用处后面的代码就不执行了。但是,tip()方法里面的渲染能正确执行。
如果可以的话,我希望添加一个。谢谢!
Agreed with @pengfei-xue it's impossible
func (this *IndexController) other() {
// some logic
tip() // simple use tip can not interrupt the logic without panic
return // You can use `return` exit the logic.
// some logic
}
@slene 我现在就是这样写的。但是,判断越多,那这个return就会越来越多。
这个方法什么时候能支持呢。
现在我在前置方法里面判断登录与否。然后,通过跳转并中止后续代码执行出错了。
//this.Redirect("/Index/Login", 200) //this.Abort("200")
以上两个方法都是在Prepare()方法里面执行的,但是,后面的还是会输出。好忧伤。能否实现一个方法,调用此方法,后续的映射的方法就不会执行了。
谢谢。
调用this.Abort("200")还会继续执行?
this.Abort("200") 会在标准输出里面输出trace信息吧。。这也不妥当吧 如: [C] Handler crashed with error 200 [C] C:/Users/ADMINI~1/AppData/Local/Temp/2/bindist550409343/go/src/pkg/runtime/panic.c 248
@wearecs 是啊。不管怎么都不能中止后面的操作方法。这如何是好呢?求助Beego各位设计师。
@slene @astaxie
为什么不在ServerJson之类的输出函数后面就直接终端后续的逻辑了呢?既然输出了结果,后面的逻辑理应就不再继续跑了。
@wearecs 因为我要在执行所有方法之前做权限验证,如果没有登录就不需要执行后续的方法了。因为后续的方法都跟Session有关系,如果没有登录session就没有。
如果放到方法里面操作。那么会导致每个方法都有判断是否登录。那就没有意义了。
我在控制器中添加了一个功能,现在您可以通过调用中断登录StopRun
type RController struct {
beego.Controller
}
func (this *RController) Prepare() {
this.Data["json"] = "astaxie"
this.ServeJson()
this.StopRun()
}
@astaxie 我刚刚试用了一下,功能一切正常。但是,离我实际需要可能还差一点。现在可以直接在前置方法里面输出了。但是,假如,我希望在前置方法里面输出一个模板并渲染这个模板并输出。那么这个时候,调用StopRun()就是空白。
之所以,有这样的需求。是因为,我做了一个整站的通用提示页面。每当有错误或者提醒的时候,我只需要传提示信息以及跳转的地址就能正常提示用户。代码如下:
// 提示页面。 // @param Message 提示信息。 // @param Second 提示信息跳转前等待秒数。 // @param Url 跳转的URL。 func (this *CommonController) Tip(Message string, Second int, Url string) { this.Data["Message"] = Message this.Data["Second"] = Second this.Data["Url"] = Url this.TplNames = "Public/tip.tpl" return }
那么此时,我在前置方法里面通过判断用户是否登录来调用这个Tip方法。但是,目前StopRun不支持。不知道有没有变通的方法。
其次是: this.Ctx.WriteString("0") 这个代码后面调用this.StopRun()不会输出。
// 提示页面。
// @param Message 提示信息。
// @param Second 提示信息跳转前等待秒数。
// @param Url 跳转的URL。
func (this *CommonController) Tip(Message string, Second int, Url string) {
this.Data["Message"] = Message
this.Data["Second"] = Second
this.Data["Url"] = Url
this.TplNames = "Public/tip.tpl"
this.Render()
this.StopRun()
}
2、 this.Ctx.WriteString("0") can output in my example.
type RController struct {
beego.Controller
}
func (this *RController) Prepare() {
this.Ctx.WriteString("000")
this.StopRun()
}
the page output "000"
@astaxie 谢谢。我再试试。
@astaxie 调用ServeJSON后,我是不想再写行代码调StopRun去中止了。为什么不在ServeJSON里面帮忙中止呢?