У меня проблемы с методом redux-saga
api call
, и он ведет себя так, как задумано.Суть проблемы, которую я считаю, заключается в том, что call
не вызывает переданную ей функцию.
Вот основная функция генератора sendEmail
, которая запускает вызов API:
/**
* A POST api call that will send a sendGrid email with csv data as an attachment
*
* @param {object} action object containing the csv data, security key string, fields of CSV, and CSV file name
*
*/
export function* sendEmail(action) {
const { payload, security_key, CSVFields, CSVFileName } = action;
// API url
const requestURL = `/api/email?security_key=${security_key}`;
// JSON2csvParser options, with the CSV fields
const opts = { fields: CSVFields };
// The CSV data, which is a string
const CSVData = payload;
try {
const parser = new Json2csvParser(opts);
const csv = parser.parse(CSVData);
// create blob with the csv string
const blob = new Blob([csv], { type: 'text/csv;charset=utf-8' });
// instantiate File Reader Web API
const reader = new FileReader();
// when reader finishes reader.readAsDataURL(blob), stepthrough the emailAPI generator
reader.addEventListener(
'load',
() => {
const gen = emailAPI(requestURL, CSVFileName, reader);
console.log("gen.next(): ", gen.next());
console.log("gen.next(): ", gen.next());
console.log("gen.next(): ", gen.next());
},
false,
);
// reader reads the contents of the blob
reader.readAsDataURL(blob);
// error handling of the reader
reader.onerror = function (error) {
console.log('Error: ', error);
};
} catch (err) {
console.error(
'sendEmail: Error occurred while parsing JSON to CSV ',
err,
);
}
}
Эта функция генератора sendEmail
вызовет другую функцию генератора emailAPI
.
Это код для этой функции генератора emailAPI
:
function* emailAPI(url, filename, reader) {
let readerResult = null
yield readerResult = reader.result.split(',')[1]
const requestBody = {
filename,
content: readerResult,
};
try {
const response = yield call(request, url, {
method: 'POST',
body: JSON.stringify(requestBody),
headers: new Headers({
'Content-Type': 'application/json',
Accept: 'application/json',
}),
});
console.log("response: ", response);
} catch (err) {
console.log("err: ", err);
yield err
}
}
Переход по gen.next()
, вот что я получаю в журналах:
gen.next()">
Как вы увидите на рисунке, значение первого итератора возвращает readerResult
успешно.Значение второго итератора возвращает сагу с избыточностью call
.Перед последним итератором (то есть когда генератор завершен) я записываю response
, , который возвращает неопределенное значение , как и последний итератор.
Функция, переданная в call
, request
, работает с другими сагами.Я регистрируюсь в функции request
, чтобы проверить, вызывается ли она. Это не .Это поведение, которого я не ожидаю, кто-нибудь знает, почему request
не вызывается?
EDIT Вот функция request
.Просто fetch
передается URL и параметры.
import 'whatwg-fetch';
/**
* Parses the JSON returned by a network request
*
* @param {object} response A response from a network request
*
* @return {object} The parsed JSON from the request
*/
function parseJSON(response) {
if (response.status === 204 || response.status === 205) {
return null;
}
return response.json();
}
/**
* Checks if a network request came back fine, and throws an error if not
*
* @param {object} response A response from a network request
*
* @return {object|undefined} Returns either the response, or throws an error
*/
function checkStatus(response) {
if (response.status >= 200 && response.status < 300) {
return response;
}
const error = new Error(response.statusText);
error.response = response;
throw error;
}
/**
* Requests a URL, returning a promise
*
* @param {string} url The URL we want to request
* @param {object} [options] The options we want to pass to "fetch"
*
* @return {object} The response data
*/
export default function request(url, options) {
console.log("request url: ", url);
return fetch(url, options)
.then(checkStatus)
.then(parseJSON);
}