From 413b63e30f27e15f7a8d82356169e6d1c594bdd6 Mon Sep 17 00:00:00 2001 From: pangdogs Date: Sun, 21 May 2023 11:31:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B4=E7=90=86=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- async.go | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/async.go b/async.go index 33ac956..74380d1 100644 --- a/async.go +++ b/async.go @@ -1,6 +1,7 @@ package golaxy import ( + "context" "errors" "kit.golaxy.org/golaxy/ec" "kit.golaxy.org/golaxy/runtime" @@ -141,8 +142,41 @@ func AwaitAll(ctxResolver ec.ContextResolver, asyncRets []runtime.AsyncRet, asyn } } -// AwaitTimeAfterFunc 等待一段时间,并继续运行后续逻辑 -func AwaitTimeAfterFunc(ctxResolver ec.ContextResolver, dur time.Duration, segment func(ctx runtime.Context)) { +// AwaitTimeAfter 等待一段时间后,运行指定逻辑 +func AwaitTimeAfter(ctxResolver ec.ContextResolver, dur time.Duration, segment func(ctx runtime.Context)) { ctx := runtime.Get(ctxResolver) + if segment == nil { + panic("nil segment") + } time.AfterFunc(dur, func() { AsyncVoid(ctx, segment) }) } + +// AwaitTimeTick 每隔一段时间,运行指定逻辑 +func AwaitTimeTick(ctxResolver ec.ContextResolver, ctx context.Context, dur time.Duration, segment func(ctx runtime.Context)) { + runtimeCtx := runtime.Get(ctxResolver) + + if ctx == nil { + panic("nil ctx") + } + + if segment == nil { + panic("nil segment") + } + + tick := time.NewTicker(dur) + + go func() { + defer func() { + recover() + }() + + for { + select { + case <-tick.C: + AsyncVoid(runtimeCtx, segment) + case <-ctx.Done(): + return + } + } + }() +}