Closed jardakotesovec closed 8 years ago
+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 options
, which would be used if available. So by default it still would be comparing by reference and if needed we could pass custom serializeKey function.
I like that idea. If anyone is interested in championing this, I would be happy to entertain the PR
— Sent from Mailbox
On Tue, Nov 3, 2015 at 2:45 PM, Jarda Kotěšovec notifications@github.com wrote:
Sounds good to me. Just having new serializeKey option in DataLoader
options
, which would be used if available. So by default it still would be comparing by reference and if needed we could pass custom serializeKey function.Reply to this email directly or view it on GitHub: https://github.com/facebook/dataloader/issues/8#issuecomment-153356466
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?