firebase - 如何在firebase读取API中调用yield

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

我有一个 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 关键字。如何调度事件以使用新值“rooms”更改 reducer 的状态

最佳答案

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

If the result is a Promise, the middleware will suspend the Generator until the Promise is resolved, in which case the Generator is resumed with the resolved value. or until the Promise is rejected, in which case an error is thrown inside the Generator.

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}})

关于firebase - 如何在firebase读取API中调用yield,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42182659/

相关文章:

java - Firestore 不查询第二个集合

java - 我的 firebase recyclerview 仅在单击任何列表时从列表中选取第一个数据

ios - 如何读取 Firebase 快照并将特定的键值对存储在通用数组中?

ios - 如何在 Swift 的 Firebase 查询中应用多个过滤器?

javascript - 验证 Redux 表单中的 URL

java - 如果我想使用 Google App Engine 从服务器代码写入 Firebase,是否需要启用计费?

JavaScript 和 Firebase : How to switch Google account

javascript - agent.add() 不起作用,尽管 console.log() 起作用

javascript - React Redux <连接器>

javascript - 如何更新不可变列表中的特定值?