私はヘルパーで redux-saga documentation をフォローしていますが、これまでのところかなり簡単に思えますが、APIコールの実行に関して問題に遭遇しました(ドキュメントポイントへのリンクが表示されます)そのような例に)
説明されていないApi.fetchUser
の部分があります。したがって、 axios または superagent ?のようなライブラリで処理する必要があるかどうかは静かに理解できません。またはそれは何か他のものです。 call, put
などのようなサガ効果はありますか?get, post
と同等のものですか?もしそうなら、なぜ彼らはそのように命名されていますか?基本的に、URL example.com/sessions
でAPIに簡単なポストコールを実行し、{ email: 'email', password: 'password' }
のようなデータを渡す正しい方法を見つけようとしています。
Api.fetchUser
は関数です。apiajax呼び出しを実行し、promiseを返す必要があります。
あなたの場合、このプロミスはユーザーデータ変数を解決するはずです。
例えば:
// services/api.js
export function fetchUser(userId) {
// `axios` function returns promise, you can use any ajax lib, which can
// return promise, or wrap in promise ajax call
return axios.get('/api/user/' + userId);
};
それからサガです:
function* fetchUserSaga(action) {
// `call` function accepts rest arguments, which will be passed to `api.fetchUser` function.
// Instructing middleware to call promise, it resolved value will be assigned to `userData` variable
const userData = yield call(api.fetchUser, action.userId);
// Instructing middleware to dispatch corresponding action.
yield put({
type: 'FETCH_USER_SUCCESS',
userData
});
}
call
、put
はエフェクト作成機能です。 GET
またはPOST
要求になじみのあるものはありません。
call
関数を使用して効果の説明を作成し、ミドルウェアにプロミスを呼び出すように指示します。 put
関数は、ミドルウェアにアクションをストアにディスパッチするよう指示する効果を作成します。
call
、put
、take
、race
などは、エフェクト作成機能です。 Api.fetchUser
は、API要求を処理する独自の関数のプレースホルダーです。
LoginSagaの完全な例を次に示します。
export function* loginUserSaga() {
while (true) {
const watcher = yield race({
loginUser: take(USER_LOGIN),
stop: take(LOCATION_CHANGE),
});
if (watcher.stop) break;
const {loginUser} = watcher || {};
const {username, password} = loginUser || {};
const data = {username, password};
const login = yield call(SessionService.login, data);
if (login.err === undefined || login.err === null && login.response) {
yield put(loginSuccess(login.response));
} else {
yield put(loginError({message: 'Invalid credentials. Please try again.'}));
}
}
}
このスニペットでは、SessionService
は、APIへのHTTPリクエストを処理するlogin
メソッドを実装するクラスです。 redux-saga call
はこのメソッドを呼び出し、データパラメーターを適用します。上記のスニペットでは、呼び出しの結果を評価し、loginSuccess
を使用してloginError
またはput
アクションを適宜ディスパッチできます。
サイドノート:上記のスニペットは、USER_LOGIN
イベント、ただしLOCATION_CHANGE
起こります。これは、race
エフェクト作成者のおかげです。