如何在 Firebase 读取 API 中调用 yield

Posted

技术标签:

【中文标题】如何在 Firebase 读取 API 中调用 yield【英文标题】:How to call yield in firebase read API 【发布时间】: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 关键字。如何调度事件以使用新值“房间”更改减速器的状态

【问题讨论】:

【参考方案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 的数组?他们的名字都一样对吗?如果是这样,为什么?它是否仅因为房间数组的本地范围而起作用?

以上是关于如何在 Firebase 读取 API 中调用 yield的主要内容,如果未能解决你的问题,请参考以下文章

Firebase getIDToken 以及如何在 API 调用中使用它

如果 Firebase 令牌在 React 应用程序中过期,如何不调用任何 api 端点?

如何通过 REST API 读取 Firebase 有序数据?

如何获取异步 Firebase 数据读取的进度?

如何从 Firebase 函数调用第三方 Rest API 以用于 Google 上的操作

Firebase Rest Api 从我的模型类中读取数据返回 null [重复]