在回调中调用yield,redux saga给了我一个例外原因?

时间:2016-08-30 19:14:02

标签: javascript asynchronous redux redux-saga

所以我评论了它给我一个追溯的地方。

export function* watchFileReader(){
const action = yield take("DROP_FILE")
console.log('action', action)
let file = action.file[0];
readFile(file, function(e){
  sessionStorage.removeItem('img')
  console.log('alskdjfalsdjkf', e.target.result)
  sessionStorage.setItem('img', e.target.result)
  // yield put({type: "UDATE", {img: e.target.result})
   })
}

更新: 这是让我的代码工作的有希望的功能。

 function readFileWithPromise(file){
  return new Promise((resolve, reject) => {
   readFile(file, function(e){
     if (e){
      resolve(e)
     }else{
      reject(e)
     }
   })
 })
}

1 个答案:

答案 0 :(得分:4)

你不能在回调中使用收益率,有两种方法可以避免这种情况:

  1. cps 效果。 DOCS LINK

    import { cps , ...  } from 'redux-saga/effects';
    
    export function* watchFileReader(){
      const action = yield take("DROP_FILE")
      let file = action.file[0];
    
      let e = yield cps(readFile,file); <----------------
    
      sessionStorage.removeItem('img')
      sessionStorage.setItem('img', e.target.result)
      yield put({type: "UPDATE", img: e.target.result})
    }
    

    注意:函数必须调用cb(null,result)来通知中间件成功的结果。如果fn遇到一些错误,那么它必须调用cb(错误)才能通知中间件发生了错误。

  2. 宣传 您的功能

    function readFileWithPromise(file){
         return new Promise((resolve,reject)=>{
             readFile(file,(err, res) => err ? reject(err) : resolve(res));
        });
    }
    

    然后调用它

    import { call, ...  } from 'redux-saga/effects';
    
    export function* watchFileReader(){
      const action = yield take("DROP_FILE")
      let file = action.file[0];
    
      let e = yield call(readFileWithPromise,file); <----------------
    
      sessionStorage.removeItem('img')
      sessionStorage.setItem('img', e.target.result)
      yield put({type: "UPDATE", img: e.target.result})
    }
    
  3. LIVE DEMO for two examples