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
Object/array as key #8
Comments
+1 Yes, something like this: const loader = new DataLoader(({phone, id}) => myLoad({phone, id}))
loader.load({phone, id}) |
This fix is monkey-patch of global Map. Need to delegate serializeKey in options of dataloader. import BaseMap from 'core-js/library/es6/map'
function objectToKey(obj) {
return Object.keys(obj).sort().map(k => k + ':' + obj[k]).join('-')
}
function serializeKey(key) {
let result
if (typeof key === 'object' && key !== null) {
result = Array.isArray(key)
? key.map(k => serializeKey(k)).join('-')
: objectToKey(key)
} else {
result = key
}
return result
}
class Map extends BaseMap {
get(key) {
return super.get(serializeKey(key))
}
has(key) {
const is = super.has(serializeKey(key))
return is
}
delete(key) {
return super.delete(serializeKey(key))
}
set(key, data) {
return super.set(serializeKey(key), data)
}
}
global.Map = Map |
Hmm, there are also cases where Objects (including Arrays) are used as identifying keys by reference. I certainly wouldn't want to also break that use-case. Do you have a proposal for how we should differentiate between these cases? Also, this library's goal is to be singular in focus and with little to no dependencies. What might work for your needs? |
Just extract cache key generating strategy from dataloader and allow to programmers define they own strategies. |
Sounds good to me. Just having new serializeKey option in DataLoader |
I like that idea. If anyone is interested in championing this, I would be happy to entertain the PR — On Tue, Nov 3, 2015 at 2:45 PM, Jarda Kotěšovec notifications@github.com
|
Any progress? |
I will dig into this soon, thanks :) |
Any progress? |
Would you consider supporting Object/array as key? Currently that will work apart from caching, because Map use
===
identity.There are situations when I need to pass more than just simple number or string. In that case I have to stringify it and parse at the moment to be able use cache. Is that something that could be part of dataloader?
The text was updated successfully, but these errors were encountered: