How to tie emitted events events into redux-saga?

后端 未结 5 649
情书的邮戳
情书的邮戳 2020-12-28 18:45

I\'m trying to use redux-saga to connect events from PouchDB to my React.js application, but I\'m struggling to figure out how to connect events emitted from PouchDB to my S

5条回答
  •  长发绾君心
    2020-12-28 19:08

    I had the same problem also using PouchDB and found the answers provided extremely useful and interesting. However there are many ways to do the same thing in PouchDB and I dug around a little and found a different approach which maybe easier to reason about.

    If you don't attach listeners to the db.change request then it returns any change data directly to the caller and adding continuous: true to the option will cause to issue a longpoll and not return until some change has happened. So the same result can be achieved with the following

    export function * monitorDbChanges() {
      var info = yield call([db, db.info]); // get reference to last change 
      let lastSeq = info.update_seq;
    
      while(true){
        try{
          var changes = yield call([db, db.changes], { since: lastSeq, continuous: true, include_docs: true, heartbeat: 20000 });
          if (changes){
            for(let i = 0; i < changes.results.length; i++){
              yield put({type: 'CHANGED_DOC', doc: changes.results[i].doc});
            }
            lastSeq = changes.last_seq;
          }
        }catch (error){
          yield put({type: 'monitor-changes-error', err: error})
        }
      }
    }
    

    There is one thing that I haven't got to the bottom. If I replace the for loop with change.results.forEach((change)=>{...}) then I get an invalid syntax error on the yield. I'm assuming it's something to do with some clash in the use of iterators.

提交回复
热议问题