Dva: Попробуйте поддержать обещание возврата для отправки (EFFECT_ACTION)

Созданный на 19 окт. 2016  ·  10Комментарии  ·  Источник: dvajs/dva

Самый полезный комментарий

@nickzheng попробуйте этот метод:

Используйте обещание, чтобы обернуть отправку в компонент, например:

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

А в эффекте два можно написать так:

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

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

Предыдущая идея @sorrycc заключалась в том, что нет необходимости

Все 10 Комментарий

1. Если я хочу интегрировать асинхронное закрытие, https://ant.design/components/modal-cn/#components -modal-demo-async, onOk должен принять обещание, тогда this.setState ({
видимый: ложь,
confirmLoading: false,
});

После отправки акции в два,
отправлять({
тип: 'пользователи / создать',
полезная нагрузка: значения,
}); Значение - это не обещание, а действие.

  1. Решением может быть установка состояний visible и confirmLoading в хранилище.

    1. Возможно ли, что после отправки действия в dva это обещание, а redux-thunk - обещание.Мое блюдо может заключаться в том, что реализация саги отличается.

@nickzheng попробуйте этот метод:

Используйте обещание, чтобы обернуть отправку в компонент, например:

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

А в эффекте два можно написать так:

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

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

Предыдущая идея @sorrycc заключалась в том, что нет необходимости

https://github.com/dvajs/dva-core/blob/0fa6888/test/effects-test.js#L332 -L365, встроенная отправка поддержки (EffectAction) возвращает обещание.

@sorrycc понравилась одна, спросите, какая версия этой функции была добавлена? Не видите журнал изменений?

@daskyrk и т. д. # 772

Поддерживается в dva @ 2 .

После встроенной поддержки обещаний, как определить действие разрешения и отклонения?
Как считать успехом, как считать неудачей?
В решении, предоставленном

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

Означает ли встроенное обещание превратить верхнюю часть в нижнюю?

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

проект

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

модель

 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 Что делать в моей ситуации, как

проект

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

модель

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

Я думаю, что независимо от того, возвращает ли бэкэнд успех или есть исключение, его можно выполнить до yield put({type:'updateState', fetching: false }) . Я знаю, что можно отправить отправку модели, чтобы установить выборку в проекте, независимо от успеха или неудачи, но это не кажется очень подходящим для этого.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги