redux-сага, фактически потребляющая данные

#javascript #react-redux #redux-saga

#javascript #реагировать-redux #redux-saga

Вопрос:

Я прочитал много руководств, касающихся «redux-saga», и понимаю, как структурировать мои редукторы и саги для непосредственного выполнения. Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как на самом деле извлекать запрошенные данные таким образом, чтобы возвращать то, что я могу использовать. Что большинство людей используют для фактического извлечения запрошенных данных?

Вот моя сага о запросе:

 import { call } from 'redux-saga/effects';

export function* request(url, method, body) {
    try {
        const result = yield call(fetch, url, { method: method, body: body });
        return {err: null, res: result };
    } catch(error) {
        return {err: error, res: null };
    }
}
 

.. «Вызов yield(fetch …» возвращает ReadableStream в Chrome, и если я использую ‘isomorphic-fetch’, как я делал с redux-thunk, он возвращает обещание. Я не могу использовать обещание в функции генератора из того, что я вижу.

Я уверен, что это, вероятно, простая строка кода для использования результата, но, похоже, я не могу ее найти. Любая помощь приветствуется!

Ответ №1:

Итак, ответ, который все (или большинство) примеров в Интернете замалчивают, заключается в том, что мне нужно разрешить обещание в функции-оболочке, а затем я могу использовать генератор, как и ожидалось. Следуя приведенному здесь примеру:

Создание галереи изображений с использованием react, redux и redux-saga

Я разделил свой генератор запросов на два отдельных метода и полностью разрешил обещание в вспомогательной функции. Конечный результат выглядит следующим образом:

 import { call } from 'redux-saga/effects';
import fetch from 'isomorphic-fetch';

const actualRequest = (method, url, body) => {
    return fetch(url, { method: method, body: body })
        .then( response => response.json()
        .then( json => json ));
}

export function* request(method, url, body) {
    try {
        const result = yield call(actualRequest, method, url, body);
        return {err: null, res: result };
    } catch(error) {
        return {err: error, res: null };
    }
}
 

Это по-прежнему позволяет мне использовать «изоморфную выборку», как и раньше, но все равно превращает ее в сагу.