登录
首页 >  Golang >  Go问答

如何利用上下文完成信号来撤销请求?

来源:stackoverflow

时间:2024-02-27 18:12:24 113浏览 收藏

大家好,我们又见面了啊~本文《如何利用上下文完成信号来撤销请求?》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面就开始本文的正式内容~

问题内容

这是来自 golang 上下文页面 https://blog.golang.org/context 的代码片段

func httpDo(ctx context.Context, req *http.Request, f func(*http.Response, error) error) error {
    // Run the HTTP request in a goroutine and pass the response to f.
    c := make(chan error, 1)
    req = req.WithContext(ctx)
    go func() { c <- f(http.DefaultClient.Do(req)) }()
    select {
        case <-ctx.Done():
            <-c // Wait for f to return.
            return ctx.Err()
        case err := <-c:
            return err
    }
}

此方法的描述如下

httpdo 函数运行 http 请求并在新的 goroutine 中处理其响应。如果 ctx.done 在 goroutine 退出之前关闭,它将取消请求:

这里的请求是如何取消的?在我看来,即使上下文完成,我们仍在等待请求的结果?这有什么帮助?


解决方案


诀窍是使用 req = req.WithContext(ctx) 将上下文传递给 http.DefaultClient.Do(req),因此 req 参数将上下文保留在内部。函数http.DefaultClient.Do()使用它,并且一旦取消原始上下文(ctx)就会退出。

事实上我不会说“httpDo函数取消请求”,它是由httpDo的调用者通过ctx取消的。这里使用 goroutine 是有争议的,我们可以直接返回 f(http.DefaultClient.Do(req))

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>