Dva: ディスパッチの返品約束をサポートしてみてください(EFFECT_ACTION)

作成日 2016年10月19日  ·  10コメント  ·  ソース: dvajs/dva

最も参考になるコメント

@nickzhengはこの方法を試してください:

次に、promiseを使用してディスパッチをコンポーネントでラップします。

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

そして、dvaの効果では、次のように書くことができます。

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

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

@sorryccの以前のアイデアは、ディスパッチが開始された場所でpromiseをラップする必要がなく、dvaがこの関数を持つことができ、デフォルトの効果がresolveとrejectを返すことができるというものでした。

全てのコメント10件

1.非同期クロージングを統合する場合、 https: //ant.design/components/modal-cn/#components -modal-demo-as​​ync、onOkはthis.setState({
目に見える:false、
読み込み中:false、
});

dvaでアクションをディスパッチした後、
急送({
タイプ: 'users / create'、
ペイロード:値、
});値は約束ではなく、行動です。

  1. 解決策は、ストアに表示状態とconfirmLoading状態を配置することです。

    1. dvaでアクションをディスパッチした後、それが約束であり、redux-thunkが約束である可能性はありますか?私の料理は、sagaの実装が異なる可能性があります。

@nickzhengはこの方法を試してください:

次に、promiseを使用してディスパッチをコンポーネントでラップします。

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

そして、dvaの効果では、次のように書くことができます。

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

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

@sorryccの以前のアイデアは、ディスパッチが開始された場所でpromiseをラップする必要がなく、dvaがこの関数を持つことができ、デフォルトの効果がresolveとrejectを返すことができるというものでした。

https://github.com/dvajs/dva-core/blob/0fa6888/test/effects-test.js#L332 -L365、組み込みのサポートディスパッチ(EffectAction)がPromiseを返します。

@sorryccは1つが好きです、この機能のどのバージョンが追加されたか尋ねますか?変更ログが表示されないようですか?

@daskyrkなど#772

dva @ 2でサポートされています。

組み込みのpromiseのサポートの後、実際に解決と拒否を定義するにはどうすればよいですか?
成功として数える方法、失敗として数える方法?
@piznによって提供される

   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 評価