2017-02-11 6 views
2

나는 redux saga API를 가지고 있는데, 여기서는 firebase에 연결하고 데이터 레코드를 읽는다.firebase에서 yield를 호출하는 방법 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}}) 
    }) 

내 put이 콜백 함수 안에 있기 때문에 yield 키워드를 사용할 수 없습니다. 새로운 값 'rooms'을 사용하여 감속기의 상태를 변경하는 이벤트를 전달하는 방법

답변

2

이 문제를 해결하려면 콜백을 약속으로 변환해야합니다. redux-saga는 call effect에 전달하는 약속을 해결하는 방법을 알고 있습니다. 그러나 전화는 약속이 아니라 기능을 필요로합니다. 문서에서 :

결과가 Promise이면 약속이 해결 될 때까지 미들웨어가 생성기를 일시 중단합니다.이 경우 생성자는 확인 된 값으로 다시 시작됩니다. 또는 Promise가 거부 될 때까지는 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}}) 
+0

매력처럼 작동했습니다! 감사 ! – Ricky

+3

이 경우, firebase의'once' 메서드는 이미 Promise를 반환하기 때문에 Promise를 인스턴스화 할 필요조차 없습니다. 'function getRooms (userId) {firebase.database() .ref ('users /'+ userId + '/ rooms')를 한 번 ('value') 누른 다음 (snap => snap. val())}'을 호출하면, const rooms = yield call (getRooms, userId)' – VonD