-
Notifications
You must be signed in to change notification settings - Fork 360
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Use async iterators for iterateCursor and iterateKeyCursor #38
Comments
Agreed! I'll make this a priority when it isn't behind a flag in the preview release of a browser. |
I've got a rough plan for this for 4.0. import { openDb, iterateRecords } from 'idb';
// …
for await (const cursor of iterateRecords(storeOrIndex, optionalRange, optionalDirection)) {
// Any of the cursor advancing methods can be called here.
// If none are called, cursor.continue() will be called automatically.
} |
Scratch that, it should be: import { openDb, iterateRecords } from 'idb';
// …
for await (const cursor of iterateRecords(storeOrIndex.openCursor(…))) {
// Any of the cursor advancing methods can be called here.
// If none are called, cursor.continue() will be called automatically.
} Where |
Why is the iterateRecord method needed? I'm sure there is a reason, but it's not obvious |
I'm looking to make it an optional import, so you don't pay the cost of it if you don't use it. |
Is this at all blocked by the problem described here? I was looking to make my own iterator in my own project but didn't because I felt like that issue might prevent it from working... |
That problem is gone in modern browsers. I'm looking to add async iteration as an optional part of the next version of the library. I just need to figure out the right API. |
I've started landing the code for this in the 4.0.0 branch https://github.com/jakearchibald/idb/blob/4.0.0/lib/async-iterators.ts. Here's how it works: // Iterate over a store
const store = db.transaction('store-name').store;
for await (const cursor of store) {
console.log(cursor.key, cursor.value);
}
// Iterate over an index
const index = store.index('index-name');
for await (const cursor of index) {
console.log(cursor.key, cursor.value);
}
// Iterate over a cursor
let cursor = await index.openCursor();
if (cursor) cursor = await cursor.advance(50);
if (cursor) for await (const cursor of cursor) {
console.log(cursor.key, cursor.value);
}
// You can update/delete/skip entries:
for await (const cursor of store) {
// Update the value.
cursor.update(cursor.value + 1);
// Skip over an item.
cursor.advance(2);
} |
That looks pretty nifty. I do have one comment, though: when iterating over a cursor, often you're happy to execute the loop zero times if the cursor returns no results. But, as
|
Yeah, that's a good idea |
Added |
Added in v4 |
async iterators seem like a good fit for the cursors, and since the spec is close to done it should be safe to implement a (shimable) api using them
The text was updated successfully, but these errors were encountered: