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在给定的示例中,这没什么大不了的,虽然很难看,但我最终遇到了一种情况,我失去了对{,},{,}的跟踪,我决定更改为所提供的模型。你如何把这些变成承诺?似乎它会以同样的方式遭受“无法修改写入事务的托管对象”的痛苦