2017-02-11 3 views
2

У меня есть API-интерфейс ssdx, где я подключаюсь к firebase и считываю данные.Как назвать доходность в firebase read API

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}}) 
    }) 

Поскольку мой объект находится внутри функции обратного вызова, я не могу использовать ключевое слово yield. Как мне отправить событие, чтобы изменить состояние моего редуктора с номерами новых значений?

ответ

2

Способ обойти это преобразование обратного вызова в обещание. redux-saga знает, как разрешить обещания, которые вы переходите на call effect. Но вызов принимает функцию, а не обещание. Из документов:

Если результат является обещанием, промежуточное программное обеспечение приостанавливает генератор до тех пор, пока не будет разрешено обещание, и в этом случае генератор будет возобновлен с разрешенным значением. или до тех пор, пока обещание не будет отклонено, и в этом случае в генераторе будет сброшена ошибка.

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}}) 
+0

Работал как очарование! благодаря ! – Ricky

+3

В этом случае вам даже не нужно создавать экземпляр Promise самостоятельно, так как метод 'once' Firebase уже возвращает Promise. Если у вас есть функция: 'function getRooms (userId) {return firebase.database(). Ref ('users /' + userId + '/ rooms'). Once ('value'). Then (snap => snap. val())} ', вы можете затем' const rooms = yield call (getRooms, userId) ' – VonD