Javascript 避免在Realm.open for nodejs/react native中出现回调地狱
请看下面的例子。它遭受着克拉贝克地狱的折磨,如果你需要做更复杂的写作,它只会变得更糟Javascript 避免在Realm.open for nodejs/react native中出现回调地狱,javascript,node.js,reactjs,react-native,realm,Javascript,Node.js,Reactjs,React Native,Realm,请看下面的例子。它遭受着克拉贝克地狱的折磨,如果你需要做更复杂的写作,它只会变得更糟 Realm.open({schema: [CarSchema, PersonSchema]}) .then(realm => { // Create Realm objects and write to local storage realm.write(() => { const myCar = realm.create('Car', { make:
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对象。这仅在回调以非故意方式传递时才可能发生。如果我给它起个名字,那就不可能了
我执行了以下操作以将领域包括在范围中:
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.writeanonymous函数在这里,实际上写东西是没有意义的。为什么不仅仅是真实的,书面文件 您可以在promise函数中封装realm write,这样所有内容都可以被链接和线性化
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=>{})
你没有那么多凹痕,我不认为这有什么大不了的。尽管如此,您仍然可以很容易地将所有带有回调的realm函数转换为承诺,然后使用这些承诺,对吗?@CertainPerformance在给定的示例中,这没什么大不了的,虽然很难看,但我最终遇到了一种情况,我失去了对{,},{,}的跟踪,我决定更改为所提供的模型。你如何把这些变成承诺?似乎它会以同样的方式遭受“无法修改写入事务的托管对象”的痛苦