这个示例演示了如何设置超时操作。
package main
import (
"math/rand"
"time"
"github.com/go-rod/rod"
)
func main() {
page := rod.New().MustConnect().MustPage("https://github.com")
page.
// Set a 5-second timeout for all chained methods
Timeout(5 * time.Second).
// The total time for MustWaitLoad and MustElement must be less than 5 seconds
MustWaitLoad().
MustElement("title").
// Methods after CancelTimeout won't be affected by the 5-second timeout
CancelTimeout().
// Set a 10-second timeout for all chained methods
Timeout(10 * time.Second).
// Panics if it takes more than 10 seconds
MustText()
// The two code blocks below are basically the same:
{
page.Timeout(5 * time.Second).MustElement("a").CancelTimeout()
}
{
// Use this way you can customize your own way to cancel long-running task
page, cancel := page.WithCancel()
go func() {
time.Sleep(time.Duration(rand.Int())) // cancel after randomly time
cancel()
}()
page.MustElement("a")
}
}
这个示例需要注意的有几个点:
Timeout(5 * time.Second).
MustWaitLoad().
MustElement("title").
.Timeout(5 * time.Second)
:为后续链式调用的所有方法设置了一个5秒的超时限制。这意味着,如果MustWaitLoad
和MustElement("title")
这两个操作中的任何一个花费的时间超过5秒,那么将会触发超时异常。
CancelTimeout().
.CancelTimeout()
:取消之前设置的超时限制。这使得后续的链式方法调用不再受到之前设置的5秒超时限制的约束。
Timeout(10 * time.Second).
MustText()
.Timeout(10 * time.Second)
:为后续的操作重新设置一个10秒的超时限制。在这个设置之后的链式调用(如MustText()
)必须在10秒内完成,否则会触发超时异常。
{
page.Timeout(5 * time.Second).MustElement("a").CancelTimeout()
}
{
// Use this way you can customize your own way to cancel long-running task
page, cancel := page.WithCancel()
go func() {
time.Sleep(time.Duration(rand.Int())) // cancel after randomly time
cancel()
}()
page.MustElement("a")
}
两种可替换的超时和取消方法:
- 第一种方法直接使用
.Timeout(5 * time.Second)
来设置超时,然后通过.CancelTimeout()
来取消超时限制。这是一种简单的设置和取消超时的方法。 - 第二种方法展示了如何自定义取消操作:
- 使用
page.WithCancel()
返回一个新的页面对象和一个cancel
函数。 - 启动一个goroutine,在随机时间后调用
cancel
函数来取消操作。这提供了更灵活的方式来根据外部条件或自定义逻辑来取消正在进行的操作。
- 使用