У меня есть приложение Django-Rest-React, и я сталкиваюсь с некоторыми ситуациями, связанными с анализом и получением данных назад и вперед.
Сначала пользователю необходимо заполнить форму или выбрать анализ желаний,и нажимает кнопку «Применить», которая запускает функцию selection (), а также отображает новый компонент.
applyClick(){
selection(); //POST method to back end
this.handleClick_selection(); //closes current component
this.handleClick_result(); //opens result component
}
selection() {
var selected= [this.state.selected_1.value, this.state.selected_2.value]
var selectedString= JSON.stringify(selected);
$.ajax({
type: 'POST',
url: '/selection/',
data: selectedString,
contentType: "application/json",
dataType: "json",
success: function(data) {
console.log("Data sent"); //This has to be deleted in afer development finish
}.bind(this)
})
}
Это отправляет некоторые данные в представление выбора, которое запускает алгоритм машинного обучения и возвращает результат обратно вjson:
def Selection_view(request):
#the connection/request is completed, the success is returned
#to ajax before the machine learning method runs
#runs the machine learning method
data = Test(
result=json.dumps(result).replace("'",'\"')
)
data.save
return HttpResponse(status=204)
Проблема заключается в том, что, пока алгоритм машинного обучения все еще работает, кнопка «Применить» также открыла компонент, который будет отображать эти данные.Компонент имеет следующие методы монтирования:
componentDidMount(){
let result_parse = []; //result of the ml algorithm
$.ajax({
url: '/test/',
dataType: 'json',
cache: false,
success: function(data) {
data.map(function(d){
result_parse = JSON.parse(d.result), //d.result is the column in the json data that I want to parse
});
this.setState({ result: result_parse,); //result is the component state to handle the values
}.bind(this),
});
render() {
return(
{/* printing the result*/}
)
}
Когда этот последний компонент загружает и выполняет запрос AJAX, алгоритм машинного обучения все еще выполняется в серверной части, поэтому ответ на запрос пуст илиошибка.Я «решил» это на мгновение, установив таймер для рендеринга компонента, например так:
applyClick(){
selection(); //POST method to back end
window.setTimeout(() => {
this.handleClick_selection(); //closes current component
this.handleClick_result(); //opens result component
}, 2000);
}
Потому что так устроен метод POST, и у сервера есть «время», чтобы вернуть json правильные значениядо того, как компонент отображается.Но я знаю, что этот ответ не идеален, есть ли способ сказать, что мой компонент результата должен открывать только json.dump (результат)?