Я пытаюсь создать приложение React, которое моделирует различные алгоритмы сортировки с различными параметрами.Я пытаюсь создать переменную задержку на каждом шаге алгоритма, чтобы он происходил с понятной для человека скоростью.Я написал эту функцию сна, чтобы сделать это:
sleep = (ms = this.state.delay) => {
return new Promise(resolve => setTimeout(resolve, ms));
}
Затем создайте async
функцию сортировки, которая await this.sleep()
при необходимости.Он работает для сортировки по пузырькам, сортировки по выделению и вставки, но приложение вылетает при попытке сортировки слиянием.Я предполагаю, что это из-за рекурсии, но я довольно озадачен.
async mergeSort(arr) {
if(arr.length < 2) {
return arr;
}
const m = Math.floor(arr.length / 2);
let left = arr.slice(0, m);
let right = arr.slice(m);
await this.sleep();
return this.merge(this.mergeSort(left), this.mergeSort(right));
}
async merge(left, right) {
let result = [];
while(left.length && right.length) {
if(left[0].props.number <= right[0].props.number) {
result.push(left.shift());
} else {
result.push(right.shift());
}
await this.sleep();
}
while(left.length) {
result.push(left.shift());
await this.sleep();
}
while(right.length) {
result.push(right.shift());
await this.sleep();
}
return result;
}
Это ошибка, которую я получаю:
Objects are not valid as a React child (found: [object Promise]).
If you meant to render a collection of children, use an array instead.
Но я не назначаю Обещания как элементырендеринга, поэтому я не уверен, что не так.
РЕДАКТИРОВАТЬ: Вот метод визуализации:
render() {
let {sorted, hatArray, sortingMethod, startTime, endTime, numberOfHats, sorting} = this.state;
return (
<div>
<SortMenu
onOptionSelect={this.onOptionSelect}
onSortBtn={this.onSortBtn}
onHatInputChange={this.onHatInputChange}
updateHatArray={this.updateHatArray}
setDelay={this.setDelay}
sorting={sorting}
/>
<Modal
open={sorted}
onClose={this.onCloseModal}
classNames={{
modal: 'custom-modal',
closeIcon: 'modal-close-button'
}}
center
>
<h1>Sorting Complete!</h1>
<p>{`${sortingMethod} sorted ${numberOfHats} hats in ${(endTime - startTime) / 1000} seconds.`}</p>
</Modal>
<div id="hat-box">
{hatArray}
</div>
</div>
);
}