如何在firebase读取API中调用yield

时间:2017-02-11 23:53:22

标签: 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'

分派事件以更改减速器的状态

1 个答案:

答案 0 :(得分:5)

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

  

如果结果是Promise,则中间件将暂停Generator,直到Promise得到解决,在这种情况下,Generator将使用已解析的值恢复。或直到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}})