Javascript 在回调中调用yield,redux传奇给了我一个例外,为什么?

Javascript 在回调中调用yield,redux传奇给了我一个例外,为什么?,javascript,asynchronous,redux,redux-saga,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.r

所以我评论了它给我的回溯

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

您不能在回调中使用yield,有两种方法可以避免这种情况:

  • cps效应

    然后叫它

    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})
    }
    
    从'redux saga/effects'导入{call,…};
    导出函数*watchFileReader(){
    const action=yield take(“删除文件”)
    let file=action.file[0];
    
    let e=yield call(readFileWithPromise,file);我迫不及待地想在我的电脑前尝试一下。谢谢,我用promisify获得了它。你太棒了!
    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})
    }