Как остановить выполнение функции JS в Go Duktape - PullRequest
0 голосов
/ 30 августа 2018

У меня есть следующий код go-duktape:

package main

import (
    "fmt"
    "gopkg.in/olebedev/go-duktape.v3"
    "time"
)

func main() {
    code := "function test(){log('testing');log('testing2');done();done();};"
    resp := make(chan string)
    ctx := duktape.New()            
    go doExec(code, ctx, resp)
    select {
    case r := <-resp:
        fmt.Printf("%s\n", r)
    case <-time.After(5 * time.Second):
        fmt.Printf("Execution timeout\n")
    }
    kill(ctx)
    close(resp)

}

func kill(ctx *duktape.Context) {
    ctx.DestroyHeap()
    ctx.Destroy()
}

func doExec(code string, ctx *duktape.Context, resp chan string) {
    ctx.PushGlobalGoFunction("done", func(c *duktape.Context) int {
        resp <- "We're done!!"
        return 0
    })
    ctx.PushGlobalGoFunction("log", func(c *duktape.Context) int {
        fmt.Println(c.SafeToString(-1))
        return 0
    })
    err := ctx.PevalString(code + ";try{test()}catch(e){log('Error in execution');}")
    if err != nil {
        fmt.Printf("Error is %s\n", err.Error())
        resp <- "Error in exec"
    }
}

Моя цель - завершить программу после вызова функции FIRST done() и не допустить выполнения каких-либо дополнительных функций после этого. Но если я запускаю следующий код, он паникует, потому что done() вызывается дважды, а второй вызов пытается записать на закрытый канал. Как мне убедиться, что он заканчивается после первого done() вызова?

Спасибо!

...