github.com/chanxuehong/wechat@v0.0.0-20230222024006-36f0325263cd/mp/dkf/record/iter.go (about) 1 package record 2 3 import ( 4 "github.com/chanxuehong/wechat/mp/core" 5 ) 6 7 // RecordIterator 8 // 9 // iter, err := NewRecordIterator(clt, request) 10 // if err != nil { 11 // // TODO: 增加你的代码 12 // } 13 // 14 // for iter.HasNext() { 15 // records, err := iter.NextPage() 16 // if err != nil { 17 // // TODO: 增加你的代码 18 // } 19 // // TODO: 增加你的代码 20 // } 21 type RecordIterator struct { 22 clt *core.Client 23 24 nextGetRequest *GetRequest 25 26 lastGetRecords []Record 27 nextPageCalled bool 28 } 29 30 func (iter *RecordIterator) HasNext() bool { 31 if !iter.nextPageCalled { 32 return len(iter.lastGetRecords) > 0 33 } 34 return len(iter.lastGetRecords) >= iter.nextGetRequest.PageSize 35 } 36 37 func (iter *RecordIterator) NextPage() (records []Record, err error) { 38 if !iter.nextPageCalled { 39 iter.nextPageCalled = true 40 records = iter.lastGetRecords 41 return 42 } 43 44 records, err = Get(iter.clt, iter.nextGetRequest) 45 if err != nil { 46 return 47 } 48 49 iter.lastGetRecords = records 50 iter.nextGetRequest.PageIndex++ 51 return 52 } 53 54 func NewRecordIterator(clt *core.Client, request *GetRequest) (iter *RecordIterator, err error) { 55 // 逻辑上相当于第一次调用 RecordIterator.NextPage, 56 // 因为第一次调用 RecordIterator.HasNext 需要数据支撑, 所以提前获取了数据 57 records, err := Get(clt, request) 58 if err != nil { 59 return 60 } 61 62 request.PageIndex++ 63 64 iter = &RecordIterator{ 65 clt: clt, 66 nextGetRequest: request, 67 lastGetRecords: records, 68 nextPageCalled: false, 69 } 70 return 71 }