繁体   English   中英

在Node.js / react-native的Realm.open中避免回调地狱

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM