Выражение yield разрешено только в теле генератора

Я использую redux-saga для получения данных API сервера. Мой вопрос в том, что я пытаюсь разработать следующий код.

Однако закомментированный yield put(get01Action(members)); имеет следующую синтаксическую ошибку.

A 'yield' expression is only allowed in a generator body.

Я не знаю, как с этим справиться.

import '@babel/polyfill';
import { fork, take, put } from 'redux-saga/effects';
import axios from "axios";

export function* rootSaga(){
    yield fork(fetch01);
    yield fork(fetch02);
}

function* fetch01() {
    while (true){
        yield take('FETCH01_REQUEST');
        axios.get('/api/members')
            .then(function (response) {
                // handle success
                let members = response.data.data;
                // yield put(get01Action(members));
            })
            .catch(function (error) {
                // handle error
                console.log(error);
            })
            .finally(function () {
                // always executed
            });
    }
}
function* fetch02() {
    ....
}

function get01Action(members){
    return {
        type: 'GET_MEMBERS',
        member_id: 0,
        members: members
    }
}

Пожалуйста, дайте мне совет.

Спасибо.


person tajihiro    schedule 27.12.2019    source источник


Ответы (2)


вы можете использовать эффект вызова, чтобы вызвать вызов axios, и тогда вы сможете использовать put.

прямо сейчас это не работает, потому что вы используете yield внутри обратного вызова обещания.

function* fetch01() {
  while (true){
    try {
      yield take('FETCH01_REQUEST');
      const response = yield call(axios.get, '/api/members');
      yield put(get01Action(response.data.data))
    } catch(err) {
      console.error(err)
    }
}
person Amit Chauhan    schedule 27.12.2019

Потому что ваш генератор fetch01 синхронизируется, но вы ждете, чтобы Promise был восстановлен.

yield не может быть заключен в другие функции, кроме генераторов.

Сделать генератор async можно так:

export async function* rootSaga(){
    yield await fork(fetch01);
    yield fork(fetch02);
}
async function* fetch01() {
    while (true) {
        yield take('FETCH01_REQUEST');
        try {
            const response = await axios.get('/api/members');
            // handle success
            let members = response.data.data;
            yield put(get01Action(members));
        } catch (error) {
            // handle error
            console.log(error);
        } finally {
            // always executed
        }
    }
}
person Hao Wu    schedule 27.12.2019