[英]Avoiding callback hell in Realm.open for nodejs/react-native
从Realm的入门开始看这个例子。 它遭受了clalback的痛苦,只有在您需要执行更复杂的写入操作时才会变得更糟。
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)
?
您可以将领域写写包装到promise函数中,因此所有内容都可以链接和线性化
const realmWrite(name,obj)=>
new Promise((resolve,reject)=>
realm.write(() => {
return resolve(realm.create(name,obj))
})
})
...then(()=>realmWrite('car',{
make: 'Ford',
model: 'Focus',
miles: 2000,
}))
.then(car=>{})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.