【问题标题】:Avoiding callback hell in Realm.open for nodejs/react-native在 Realm.open 中避免 nodejs/react-native 的回调地狱
【发布时间】: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


【解决方案1】:

您可以将领域 write 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=>{})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-18
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多