【发布时间】:2018-03-30 05:48:44
【问题描述】:
看看这个来自Realm's getting started的例子。它遭受了回扣地狱的困扰,并且如果您需要进行更复杂的写入,它只会变得更糟。
Realm.open({schema: [CarSchema, PersonSchema]})
.then(realm => {
// Create Realm objects and write to local storage
realm.write(() => {
const myCar = realm.create('Car', {
make: 'Honda',
model: 'Civic',
miles: 1000,
});
myCar.miles += 20; // Update a property value
});
// Query Realm for all cars with a high mileage
const cars = realm.objects('Car').filtered('miles > 1000');
// Will return a Results object with our 1 car
cars.length // => 1
// Add another car
realm.write(() => {
const myCar = realm.create('Car', {
make: 'Ford',
model: 'Focus',
miles: 2000,
});
});
// Query results are updated in realtime
cars.length // => 2
})
.catch(error => {
console.log(error);
});
避免滥用回调的一个好方法是使用命名函数而不是匿名函数。
这是我带来的:
writeMsgs = () => {
record = message => {
id = md5('random thing...')
doc = {id : id ,
favorite : message.favorite ,
}
realm.create(tableName, doc)
}
SomethingThatReturnsPromise.then(messages => messages.map(record))
this.setState( { loading: false, refreshing: false } )
}
realmWrite = realm => realm.write(writeMsgs)
realmOpen = () => Realm.open(schemas).then(realmWrite)
然后我只需要执行realmOpen() 即可触发realmWrite。问题是:realm.write 将没有参数的回调作为其参数。但是在这个回调中,使用了realm 对象。这只有在匿名传递回调时才有可能。如果我给它一个名字,那将是不可能的。
我执行了以下操作以将realm 包含在范围内:
writeMsgs = realm => () => {
record = message => {
id = md5('random thing...')
doc = {id : id ,
favorite : message.favorite ,
}
realm.create(tableName, doc)
}
SomethingThatReturnsPromise.then(messages => messages.map(record))
this.setState( { loading: false, refreshing: false } )
}
realmWrite = realm => realm.write(writeMsgs(realm))
realmOpen = () => Realm.open(schemas).then(realmWrite)
但是,Realm 遵守:不能在写入事务之外修改托管对象
我不知道写事务机制是如何工作的,但看起来它无法适应以避免过度使用回调。对我来说realm.write(anonymous_function_here_that_actually_writes_things) 毫无意义。为什么不只是real.write(document_to_write)?
【问题讨论】:
-
你没有那么多缩进,我认为这没什么大不了的。不过,您可以轻松地将
realm的所有带有回调的函数转换为 Promise,然后使用这些 Promise,对吧? -
@CertainPerformance 在给定的示例中,这没什么大不了的(虽然它很丑),但我最终遇到了我忘记了 {,},({, }) 的情况,我决定更改为呈现的模型。你如何将这些变成承诺?似乎它会以同样的方式遭受“无法修改写入事务之外的托管对象”
标签: javascript node.js reactjs react-native realm