如何在 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 有序数据?