作者:广告公司英子 | 来源:互联网 | 2023-02-12 10:39
我有一个redux传奇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> ctlevi..:
解决这个问题的方法是将回调转换为promise.redux-saga知道如何解决传递给调用效果的 promise .但是召唤需要一个功能,而不是承诺.来自文档:
如果结果是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}})
在这种情况下,你甚至不必自己实例化一个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)`