1

少し変更してredux-loop の公式の例を実行します。

  1. 代わりにfetch、タイムアウトで promise を使用します。
  2. ログ ミドルウェアを追加しました (redux.js.org チュートリアルからコピーして貼り付けます)。

副作用関数:

import {createStore, compose, applyMiddleware} from 'redux';
import {install, loop, Cmd} from 'redux-loop';

function fetchUser(userId) {
    return Promise.resolve((res, rej) => setTimeout(() => res(userId), 1000));
}

行動:

function initAction() {
    return {
        type: 'INIT'
    };
}

function userFetchSuccessfulAction(user) {
    return {
        type: 'USER_FETCH_SUCCESSFUL',
        user
    };
}

function userFetchFailedAction(err) {
    return {
        type: 'USER_FETCH_ERROR',
        err
    };
}

初期状態:

const initialState = {
        initStarted: false,
        user: null,
        error: null
    };

レデューサー:

function reducer(state = initialState, action) {
        console.log(action);  // I added this line
        switch (action.type) {
            case 'INIT':
                return loop(
                    {...state, initStarted: true},
                    Cmd.run(fetchUser, {
                        successActionCreator: userFetchSuccessfulAction,
                        failActionCreator: userFetchFailedAction,
                        args: ['1234']
                    })
                );

            case 'USER_FETCH_SUCCESSFUL':
                return {...state, user: action.user};

            case 'USER_FETCH_FAILED':
                return {...state, error: action.error};

            default:
                return state;
        }
    }

私のカスタム ログ ミドルウェア:

    const logger = store => next => action => {
        console.group(action.type);
        console.info('dispatching', action);
        let result = next(action);
        console.log('next state', store.getState());
        console.groupEnd();
        return result
    };

ストアを構成します。

const enhancer = compose(
        applyMiddleware(logger),
        install()
    );

    const store = createStore(reducer, initialState, enhancer);

最初のアクションをディスパッチしてすべてを開始する: (私のコード)

store.dispatch(initAction());

出力:

ここに画像の説明を入力


ご覧のとおり、2 番目のアクションはログ ミドルウェアをスキップし、ログの最後の行もわかりません。レデューサーが実際のユーザー オブジェクトではなく関数を受け取ったのはなぜですか?

4

1 に答える 1

2

レデューサーが実際のユーザー オブジェクトではなく関数を受け取ったのはなぜですか?

return Promise.resolve((res, rej) => setTimeout(() => res(userId), 1000));

Promise.resolve は、既に解決済みの状態にある promise を作成するために使用されます。プロミスが解決する必要がある値を渡すことを期待しています。あなたの場合、関数に解決するように要求しました。

あなたはおそらく次のことをするつもりでした:

return new Promise((res, rej) => setTimeout(() => res(userId), 1000))
于 2018-10-27T13:14:50.843 に答える