Repository navigation
Unclear how to resume iterating with PageIterator if the callback returns False #688
Description
Activity
- addedstatus:waiting-for-triageAn issue that is yet to be reviewed or assignedAn issue that is yet to be reviewed or assigned
on Sep 23, 2024 For context, this is so I can add Python snippets to this documentation: https://learn.microsoft.com/en-us/graph/sdks/paging
Reacted by Sander MaijersI've done some experimentation, and I found that after a pause, I can just call
iterateagain to start back up from where it left off. However, there's no good way that I can see for my code to detect that it should stop callingiterate. Once the iterator gets to the last page from the server, my code just continually iterates over that page.while True: # The callback here returns false after iterating over 25 messages await page_iterator.iterate(Paging.message_callback_with_pause) # Ideally I could test something here and break out of the loop time.sleep(5)
Jason Johnston (@jasonjoh) Can you use the
has_nextattribute ofPageIteratorunder Python?I seems like
has_nextnever gets updated. And I also end up in loop withPageResult.odata_next_linkstaying the same.Shem Ogumbe (@shemogumbe) As author of the page iterator PR, can you please check whether my previous comment arises from a defect?
- addedpriority:p2Medium. For a p2 bug, generally have a work-around. Bug SLA <=30 daysMedium. For a p2 bug, generally have a work-around. Bug SLA <=30 daysbugSomething isn't workingSomething isn't workingand removedstatus:waiting-for-triageAn issue that is yet to be reviewed or assignedAn issue that is yet to be reviewed or assigned
on Feb 4, 2025 A workaround I've found is to check
bool(iterator.current_page.odata_next_link)instead ofiterator.has_next. I think the problem is in PageIterator Initself.has_next = bool(page.odata_next_link). I haven't tested it extensively, but a loop like this works for my purpose:memberOf = await graphClient.users.by_user_id(email).member_of.get() iterator = PageIterator(memberOf, graphClient.request_adapter) temp = [] def process_item(item)-> bool: if item and hasattr(item, 'id'): temp.append(item.id) return True while bool(iterator.current_page.odata_next_link): await iterator.iterate(process_item)
In other SDKs, the iterator class typically has a
Resumemethod to restart the iteration where it left off, and a correspondingStateproperty to check if the iterator has completed or not. For example, in .NET:Is there a way to do this in this SDK?