Dva: Cobalah untuk mendukung janji pengembalian untuk pengiriman (EFFECT_ACTION)

Dibuat pada 19 Okt 2016  ·  10Komentar  ·  Sumber: dvajs/dva

Komentar yang paling membantu

@nickzheng coba metode ini:

Gunakan janji untuk membungkus pengiriman dalam komponen, misalnya:

   new Promise((resolve, reject) => {
      dispatch({
         type: 'users/create',
         payload: {
             values,
             resolve,
             reject,
         },
      }); 
   })
   .then( res => {
      console.log(res);
   })
  .catch( err => {
      console.log(err);
  })

Dan dalam efek dva, Anda dapat menulisnya seperti ini:

* create({ payload }, { put, call }) {
  const { value, resolve, reject } = payload;
  // 一些操作之后

  if (success) {
     resolve('done');
  } else {
     reject('error');
  }
}

Gagasan sebelumnya dari @sorrycc adalah bahwa tidak perlu membungkus janji di tempat pengiriman dimulai, dan dva dapat memiliki fungsi ini, dan efek default dapat mengembalikan penyelesaian dan penolakan.

Semua 10 komentar

1. Jika saya ingin mengintegrasikan penutupan asinkron, https://ant.design/components/modal-cn/#components -modal-demo-async, onOk harus menerima janji di this.setState({
terlihat: palsu,
konfirmasiMemuat: salah,
});

Setelah mengirimkan tindakan di dva,
menugaskan({
ketik: 'pengguna/buat',
muatan: nilai,
}); Nilai bukanlah janji, tetapi tindakan.

  1. Solusinya adalah dengan menempatkan status visible dan confirmLoading di store.

    1. Mungkinkah setelah mengirim tindakan di dva, itu adalah janji, dan redux-thunk adalah janji. Hidangan saya mungkin implementasi saga berbeda.

@nickzheng coba metode ini:

Gunakan janji untuk membungkus pengiriman dalam komponen, misalnya:

   new Promise((resolve, reject) => {
      dispatch({
         type: 'users/create',
         payload: {
             values,
             resolve,
             reject,
         },
      }); 
   })
   .then( res => {
      console.log(res);
   })
  .catch( err => {
      console.log(err);
  })

Dan dalam efek dva, Anda dapat menulisnya seperti ini:

* create({ payload }, { put, call }) {
  const { value, resolve, reject } = payload;
  // 一些操作之后

  if (success) {
     resolve('done');
  } else {
     reject('error');
  }
}

Gagasan sebelumnya dari @sorrycc adalah bahwa tidak perlu membungkus janji di tempat pengiriman dimulai, dan dva dapat memiliki fungsi ini, dan efek default dapat mengembalikan penyelesaian dan penolakan.

https://github.com/dvajs/dva-core/blob/0fa6888/test/effects-test.js#L332 -L365, pengiriman dukungan bawaan (EffectAction) mengembalikan Janji.

@sorrycc suka satu, tanyakan versi mana dari fitur ini yang ditambahkan? Sepertinya tidak melihat changelog?

@daskyrk dll #772

Ini didukung di dva@2 .

Setelah dukungan bawaan untuk janji, bagaimana mendefinisikan penyelesaian dan penolakan yang berlaku?
Bagaimana cara menghitung sebagai sukses, bagaimana menghitung sebagai kegagalan?
Dalam solusi yang disediakan oleh

   new Promise((resolve, reject) => {
      dispatch({
         type: 'users/create',
         payload: {
             values,
             resolve,
             reject,
         },
      }); 
   })
   .then( res => {
      console.log(res);
   })
  .catch( err => {
      console.log(err);
  })

Apakah janji bawaan berarti mengubah bagian atas menjadi bagian bawah?

dispatch({
  type: 'users/create',
  payload: {
    values,
    resolve,
    reject,
  },
})
  .then(res => {
    console.log(res);
  })
  .catch(err => {
    console.log(err);
  })

proyek

const { dispatch } = this.props;
dispatch({
   type: 'specification/fetch',
    payload: applicationId,
 }).then((data) => {
     console.log(data)
 });

model

 effects: {
    * fetch({ payload }, { call, put, select}) {
      const response = yield call(querySpecification, payload);
      yield put({
        type: 'list',
        payload: response
      });
      return yield select(state => state.specification.list);  //important
    }
},
reducers: {
    list(state, action) {
      return {
        ...state,
        list: action.payload
      };
    }
  }

@Youthink Apa yang harus dilakukan dalam situasi saya seperti di bawah ini

proyek

this.props.dispatch({
    type: 'app/login',
    payload: {
        phone: '13312332131',
        smscode: '6666',
    }
}).then(data => {
    console.log('success result', data)
}).catch(err => {
    console.warn('error result', err)
})

model

*login({ payload }, { call, put }) {
    // 请求状态 fetching 为 true,方便页面显示loading状态
    yield put({ type: 'updateState', fetching: true })
    // 这里进行登录 service
    const login = yield call(authService.login, payload)
    // 如果上面的 authService.login 异常了,下面的逻辑就不会进行了,下面的 fetching 设置为 false 也不会执行到
    if (login) {
        yield put(NavigationActions.back())
        Storage.set('login', login)
    }
    // 这里重置下 状态 fetching 为 false
    yield put({type:'updateState', fetching: false })
},

Saya pikir tidak peduli apakah backend mengembalikan kesuksesan atau ada pengecualian, itu dapat dieksekusi ke yield put({type:'updateState', fetching: false }) . Saya tahu bahwa adalah mungkin untuk mengirim pengiriman ke model untuk mengatur pengambilan dalam proyek, terlepas dari keberhasilan atau kegagalan, tetapi tampaknya tidak terlalu tepat untuk melakukannya.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat