【问题标题】:How to call yield in firebase read API如何在 Firebase 读取 API 中调用 yield
【发布时间】:2017-06-30 04:12:49
【问题描述】:

我有一个 redux saga API,通过它连接到 firebase 并读取数据记录。

var roomRef = firebase.database().ref('/Users/' + userid + '/rooms')
  var rooms = []
  roomRef.once('value', function (snap) {
    var roomkeys = snap.val()
    for (var roomkey in roomkeys) {
      firebase.database().ref('/Rooms/' + roomkey).once('value', function (item) {
        rooms.push(item.val())
      })
    }
    console.log(rooms)
   --> put({type: 'LOAD_ROOMS', payload: { rooms: rooms}})
  })

由于我的 put 在回调函数中,我不能使用 yield 关键字。如何调度事件以使用新值“房间”更改减速器的状态

【问题讨论】:

    标签: firebase firebase-realtime-database redux redux-saga


    【解决方案1】:

    解决这个问题的方法是将回调转换为 Promise。 redux-saga 知道如何解决你传递给call effect 的承诺。但是 call 需要一个函数,而不是一个承诺。来自文档:

    如果结果是 Promise,中间件将暂停生成器,直到 Promise 被解析,在这种情况下,生成器会以解析后的值恢复。或者直到 Promise 被拒绝,在这种情况下,生成器内部会抛出错误。

    var roomRef = firebase.database().ref('/Users/' + userid + '/rooms')
    var rooms = yield call(function() {
      return new Promise(function(resolve, reject) {
        roomRef.once('value', function (snap) {
          var rooms = []
          var roomkeys = snap.val()
          for (var roomkey in roomkeys) {
            firebase.database().ref('/Rooms/' + roomkey).once('value', function (item) {
              rooms.push(item.val())
            })
          }
          resolve(rooms)
        })
      })
    })
    yield put({type: 'LOAD_ROOMS', payload: { rooms: rooms}})
    

    【讨论】:

    • 在这种情况下,您甚至不必自己实例化 Promise,因为 firebase 的 once 方法已经返回了 Promise。如果你有这样的功能:function getRooms(userId){ return firebase.database().ref('users/' + userId + '/rooms').once('value').then( snap => snap.val() ) },那么你可以const rooms = yield call(getRooms, userId)
    • 您的 var 房间是您解析的内容以及您放入 yield 的数组?他们的名字都一样对吗?如果是这样,为什么?它是否仅因为房间数组的本地范围而起作用?
    猜你喜欢
    • 1970-01-01
    • 2020-04-16
    • 2018-04-11
    • 2021-02-01
    • 1970-01-01
    • 2017-08-19
    • 2019-04-02
    • 1970-01-01
    • 2016-12-25
    相关资源
    最近更新 更多