我有一个工作ID的集合,我必须为其提供数据。每个作业ID响应都可能返回3页。得到所有答复后,我将提取一些道具并将其写入csv文件。
如果响应元数据表明它是x的第1页,我想递归地调用一个函数来获取此数据。
一旦我拥有x的x页,我将不再希望调用该例程,当所有例程完成后,我将继续执行应用程序逻辑。
我一直在研究go例程和渠道,作为处理这种流程的一种方式。
func (c *Controller) GetBulkJobProps() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
jobs := models.BulkJobListIDs{}
json.NewDecoder(r.Body).Decode(&jobs)
if len(jobs.BulkSendJobs) == 0 {
err := models.Error{}
err.Message = "Missing bulk job id(s)"
utils.SendError(w, 400, err)
return
}
c := make(chan string)
for _, id := range jobs.BulkSendJobs {
go getLink(id, 1, c)
}
for l := range c {
go func(id string) {
if id == "quit" {
close(c)
return
}
getLink(id, 2, c)
}(l)
}
filename := time.Now().Format("02-01-2006_15:04:05")
utils.CreateCSV(filename, csvResponse)
csvResponse = nil
w.Header().Add("Content-Type", "application/json")
utils.SendSuccess(w, nil)
}
}
func getLink(id string, page int, c chan string) {
data := utils.FetchBulkJobProps(id, page)
for _, r := range data.SignatureRequests {
for _, sr := range r.Signatures {
csvResponse = append(csvResponse, []string{r.Title, sr.SignerEmailAddress, sr.StatusCode})
if data.ListInfo.NumPages > data.ListInfo.Page {
c <- id
return
}
c <- "quit"
}
}
}
我希望通过确保data.ListInfo.NumPages > data.ListInfo.Page
可以断言存在下一个要请求的页面,如果不是的话,我想发信号通知我的频道以某种方式结束该特定例程。
我想也许可以通过将c <- "quit"
传递回通道,而不是需要后续调用的id来发信号,让我的函数字面量结束该例程。
for l := range c {
go func(id string) {
if id == "quit" {
close(c)
return
}
getLink(id, 2, c)
}(l)
}
相反,这似乎使我的应用程序崩溃,因为我现在正在关闭的频道上进行发送。