Comments (12)
Agreed! I'll make this a priority when it isn't behind a flag in the preview release of a browser.
from idb.
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.
}
from idb.
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 iterateRecords
takes a cursor or a promise for a cursor.
from idb.
Why is the iterateRecord method needed? I'm sure there is a reason, but it's not obvious
from idb.
I'm looking to make it an optional import, so you don't pay the cost of it if you don't use it.
from idb.
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...
from idb.
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.
from idb.
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);
}
from idb.
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 openCursor
will return null
when the provided query doesn't match, this necessitates that if (cursor)
check. Maybe it'd be nice to have a different flavour (openCursorIterable
?) that will always return an async iterator, finishing immediately in the no-values-found case, allowing this code:
for await (const cursor of index.openCursorIterable(query)) {
doStuff(cursor.value);
}
from idb.
Yeah, that's a good idea
from idb.
Added .iterate
to stores and indexes. Takes the same args are openCursor
. 1337312#diff-c6b8a053edbb56620d53f014adc13bf1
from idb.
Added in v4
from idb.
Related Issues (20)
- Database persistence HOT 2
- Add support for Typescript 5.2's `using` keyword
- No able create more the 5 table object in Indexdb
- egronomic way to provide schema via JSDoc
- ConstraintError: Key already exists in the object store. HOT 2
- Not able to import openDB from idb/with-async-ittr in Ver 8
- Comment confusing `unlisten`
- delete only takes key as string but autoincremented keys are numbers HOT 1
- When I try to use main.js in my app I get a referenc eerror-
- DeleteDB should call Close()
- How order for getAllFromIndex
- TS declaration error: Type 'IndexNames<DBTypes, StoreName>' does not satisfy the constraint 'string' HOT 8
- Types exports are incorrect in package.json
- Add type exports for openDB callbacks
- TypeError: Invalid value used as weak map key. when my value is `NaN`
- Remove Add Event Listeners?
- Is the nativescript browser compatible with this library?
- "No overload matches this call" when passing the store name as a variable
- `done` promise semantics is confusing and may cause uncaught promise rejections HOT 2
- cursor.continue(key) can hang? HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from idb.