У меня есть страница React, которая запрашивает у пользователя ввод некоторой информации и возвращает массив объектов JSON из API.
Запрос может вернуть большой результат, приводящий к зависанию страницы при загрузке выборки, поэтому я хотел использовать веб-работника для разделения потоков и добавления колеса загрузки, чтобы пользователь мог знать, что сайт не потерпел крах .
У меня сейчас есть веб-работник с этим кодом:
Рабочий код
const self = this;
export default () => {
self.addEventListener('message', e => {
if (!e) return;
let query = e.data;
let res = null;
fetch(`https://statsapi.web.nhl.com/api/v1/schedule?startDate=${query}&endDate=${query}`)
.then(response => {
return response.json();
})
.then(function(_ref) {
postMessage(_ref);
});
});
};
Это только пример API, но реальный результат API будет намного больше и займет больше времени для загрузки.
Я также использую function(_ref)
вместо ({ data }) =>
, потому что при обработке через babel ({ data }) =>
будет превращаться в _ref.data
, когда нет доступа к данным через ref, а _ref
работает при возврате массива.
У меня есть код, реализованный в классе веб-работника, например:
Рабочий конструктор
export default class WebWorker {
constructor(worker) {
const code = worker.toString();
const blob = new Blob(['(' + code + ')()'], { type: 'text/javascript' });
return new Worker(URL.createObjectURL(blob));
}
}
Я называю веб-работника из другого класса так:
Создание Web Worker
componentDidMount = () => {
this.worker = new WebWorker(worker);
}
getInfo = () => {
this.worker.postMessage(this.state.query);
this.setState(prevState => ({
...prevState,
open: true
}), () => {
this.worker.addEventListener('message', (event) => {
const res = event.data;
this.setState({
results: res,
open: false
});
});
});
}
Проблема, с которой я столкнулся, заключается в том, что, когда я пытаюсь назвать его так, как я, веб-работник, похоже, не обрабатывает данные в другом потоке. Страница по-прежнему зависает, хотя веб-работник получает данные, так как он по-прежнему правильно устанавливает состояние после замораживания.
Я новичок в веб-работе, поэтому мне не хватает чего-то, что позволило бы ему работать, или был бы другой способ использования веб-работника с выборкой?