我有一个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'
分派事件以更改减速器的状态答案 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}})