我有一个 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/