gpt4 book ai didi

javascript - 避免 Nodejs/react-native 的 Realm.open 中的回调 hell

转载 作者:行者123 更新时间:2023-12-03 02:11:07 24 4
gpt4 key购买 nike

查看 Realm's getting started 中的示例。它遭受回拨 hell 的困扰,如果您需要进行更复杂的写入,情况只会变得更糟。

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 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=>{})

关于javascript - 避免 Nodejs/react-native 的 Realm.open 中的回调 hell ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49569087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com