Javascript 是否有一种标准/优雅的方法可以在没有Firebase的情况下实现类似Firebase的反应对象?

Javascript 是否有一种标准/优雅的方法可以在没有Firebase的情况下实现类似Firebase的反应对象?,javascript,ruby-on-rails,vue.js,Javascript,Ruby On Rails,Vue.js,像Firebase这样的实时数据库,我喜欢的是它们的推送功能。例如,vuefire使自更新对象变得非常简单,而不需要串联数百个套接字侦听器和回调 这是一个例子: data(){ return { books: [] } }, created(){ axios.get('/books', (books) => { this.books = books }) } 为了增加db反应性,我需要至少3个事件“book created”、“book Update”、

像Firebase这样的实时数据库,我喜欢的是它们的推送功能。例如,vuefire使自更新对象变得非常简单,而不需要串联数百个套接字侦听器和回调

这是一个例子:

data(){
  return {
    books: []
  }
},

created(){
  axios.get('/books', (books) => {
    this.books = books
  })
}
为了增加db反应性,我需要至少3个事件“book created”、“book Update”、“book removed”

Pusher.on('book-created', (book) {
  this.books.push(book)
})
Pusher.on('book-updated', (book) {
  let b = _.find(this.books, {id: book.id})

  if(b){
   _.extend(b, book)
  } 
})
etc..
当您有许多模型和许多视图时,它会变得非常复杂,一些视图有一组不同的书籍,因此我不能只使用一个标准的books vuex变量。是否有一种合理/快速的方法来实现这一点


我当然可以在后端提取发送的事件,这样我的所有模型都会自动推送事件。但前端是我感到困惑的地方。

我以前从未与pusher合作过,我也不知道您所指的“不同的书籍集”是什么,但我想我可以给您一些起点,让您的代码看起来更优雅一些

我建议的第一件事;不要试图重新发明轮子,使用它。只需像通常使用后端一样创建一个mixin,使用一些动态选项(可以在组件的
data()
中设置),并将其导入到每个需要相同功能、不同选项的组件上

(您需要相应地调整它)

我的第二个建议是使用一些定制方法和钩子来触发事件和请求,但在完成mixin的代码后,我发现使用更多方法扩展数组的原型会增加太多的复杂性,而一个好的mixin恰恰相反

如果你想深入研究,你可能想看看RXJ和可观测数据。您可以使用Pusher在上面构建一些东西,以获得类似Firebase实时对象的东西

  • 教程:
  • RxJS:
  • Vue的正式实施:
// Create an ES6 module and export this function, or the whole mixin
// (in that case export the mixin instead)
const initPusher = function ({pusher, collection, key, events}, component) {
  collection = component[collection]

  pusher.on(events.created, (record) => {
    collection.push(record)
  })

  pusher.on(events.updated, (record) => {
    let r = _.find(collection, {[key]: record[key]})

    if(r){
     _.extend(r, record)
    } 
  })
}

const PusherMixin = {
  methods: {
    // You can add some common methods for all your
    // components making use of this mixin
  },
  created () {
    initPusher(Object.assign({}, {
      pusher: Pusher,
      collection: 'collection',
      key: 'id',
      events: {
        created: 'book-created',
        updated: 'book-updated'
      }
    }, this.pusherOptions), this)
  }
}

new Vue({
  el: "#app",
  mixins: [PusherMixin],
  data () {
    return {
      books: [],
      pusherOptions: {
        collection: 'books',
        key: 'id',
        events: {
          created: 'book-created',
          updated: 'book-updated'
        }
      }
    }
  }
})