func PostHistoryAsync(a *decorator.ApiBase, data *HistorySync) error { logger.AccessLogger.Info("PostBusinessAgentAppUp...") var ( num int64 err error ) utils.Error(a.Ts.Table("history_" + data.PlatformCode + "_order"). Select("ctime"). Count(&num).Error) if num == data.EndTime-data.StartTime { return a.ReturnSuccessCustomResponse(a.NewSuccessResponseCommon()) } else { status := make(chan error) go func() { err = GetOrderList(data.StartTime, data.EndTime, data.PlatformCode, data.ShopId, a.Ts) if err != nil { } status <- err }() if status != nil { return errors.New("获取订单任务失败") } } return a.ReturnSuccessCustomResponse(a.NewSuccessResponseCommon()) }对此进行修改
时间: 2024-04-16 12:29:21 浏览: 92
在你给出的代码中,我注意到你在判断 `status` 是否为 `nil` 的时候并没有从 `status` channel 接收任何值。这可能导致主函数在判断之前无法正确等待 goroutine 的完成。我将为你提供一种修改后的方式来确保正确等待异步任务完成,并处理可能的错误。
```go
func PostHistoryAsync(a *decorator.ApiBase, data *HistorySync) error {
logger.AccessLogger.Info("PostBusinessAgentAppUp...")
var (
num int64
err error
)
utils.Error(a.Ts.Table("history_" + data.PlatformCode + "_order").
Select("ctime").
Count(&num).Error)
if num == data.EndTime-data.StartTime {
return a.ReturnSuccessCustomResponse(a.NewSuccessResponseCommon())
} else {
status := make(chan error, 1) // 修改为带有缓冲的 channel,容量设置为 1
go func() {
err = GetOrderList(data.StartTime, data.EndTime, data.PlatformCode, data.ShopId, a.Ts)
status <- err // 将错误值发送到 status channel
}()
err = <-status // 从 status channel 接收错误值
if err != nil {
return errors.New("获取订单任务失败")
}
}
return a.ReturnSuccessCustomResponse(a.NewSuccessResponseCommon())
}
```
在这个修改后的代码中,我将 `status` channel 修改为带有缓冲的 channel,并将容量设置为 1。这样可以确保 goroutine 在发送错误值之前不会被阻塞。然后,我使用 `<-status` 语法从 channel 中接收错误值,并将其赋值给 `err` 变量。如果 `err` 不为 `nil`,则返回一个表示获取订单任务失败的错误信息。
这样的修改可以确保正确等待异步任务的完成,并处理可能的错误。
阅读全文