亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通過用戶操作取消功能(html/模板)

通過用戶操作取消功能(html/模板)

Go
米脂 2022-08-15 15:55:55
我的目標是:有一個 html 頁面,其中包含用于啟用/禁用功能<a href>啟用時:調用函數:我示例中的總和禁用時:停止/終止之前調用的功能前兩點是可以的(或者隨時告訴我我可以改進什么)但是我不知道如何做第三點(因為我用第一點的方式不好?  package main        import (        "html/template"        "github.com/labstack/echo"        "log"        "io"        "net/http"        "strconv"        "fmt"        "time"    )        //init LOG    func init(){        log.SetPrefix("TRACE: ")        log.SetFlags(log.Ldate | log.Ltime | log.Llongfile)        log.Println("init started")    }        // main function    func main() {        // defining struct instance    settings.Enabled = false        // Parsing the required html    // file in same directory    // Parsing Templates    t := &Template{        templates: template.Must(template.ParseGlob("test.html")),    }        // standard output to print merged data        e := echo.New()    e.Renderer = t    e.HideBanner = false    e.HidePort = false    e.Debug = true        e.GET("/", index)    e.GET("/toggleEnable", toggleEnable)        e.Start("127.0.0.1" + ":" + strconv.Itoa(8080))        }        func index(c echo.Context) error {        return c.Render(http.StatusOK, "index", settings)    }         // Settings Type ...    type Settings struct {        Enabled bool    }    var settings Settings        type Template struct {        templates *template.Template    }        func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error {        return t.templates.ExecuteTemplate(w, name, data)    }        func toggleEnable(c echo.Context) error {        if settings.Enabled {            settings.Enabled = false        } else {            settings.Enabled = true            Sum()        }        return c.Redirect(http.StatusTemporaryRedirect, c.Request().Header.Get("Referer"))    }        func Sum() {            sum := 0        for i := 1; i < 50; i++ {            sum += i            fmt.Println(sum)            time.Sleep(3 * time.Second)        }        }
查看完整描述

1 回答

?
DIEA

TA貢獻1820條經驗 獲得超3個贊

正如目前所寫的,當瀏覽器請求時,在完成之前不會返回任何內容(這將需要大約150秒)。完成后,將返回/顯示帶有的頁面。如果你想為用戶提供中斷過程的能力,那么最好在Goroutine中運行它;像這樣:/toggleEnableSum()Sum()Test enabled : false


// Settings Type ...

type Settings struct {

    Enabled bool

    Stop chan struct{}

}

var settings Settings


type Template struct {

    templates *template.Template

}


func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error {

    return t.templates.ExecuteTemplate(w, name, data)

}


func toggleEnable(c echo.Context) error {

    if settings.Enabled {

        settings.Enabled = false

        close(settings.Stop)

    } else {

        settings.Enabled = true

        settings.Stop = make(chan struct{})

        go Sum(settings.Stop)

    }

    return c.Redirect(http.StatusTemporaryRedirect, c.Request().Header.Get("Referer"))

}


func Sum(stop chan struct{}) {

    sum := 0

    for i := 1; i < 50; i++ {

        sum += i

        fmt.Println(sum)

        select {

        case <-stop:

            fmt.Println("stopped")

            return

        case <-time.After(3 * time.Second):

        }

    }

}

請注意,這存在一些問題。它是在假設將有一個客戶端并且計時器完成時頁面不會更新的假設下編寫的(您需要添加刷新或類似內容)。


下一步是在html頁面中顯示計數


為此,您需要一種瀏覽器請求更新的方法。這可能是通過刷新(相當簡單但不是很好的用戶體驗)或使用Javascript(輪詢或使用websockets)


查看完整回答
反對 回復 2022-08-15
  • 1 回答
  • 0 關注
  • 79 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號