异步长时间运行操作 API 调用

我的 React 应用程序中有一个函数可以将数据发送到我的 Django API。一旦收到数据,django 就会调用外部 python 函数来执行一些代码。

目前,我的 javascript 在收到响应时会发出警报ok。然而,在外部函数完成之前,Django 不会发送此响应;这是一个问题,因为根据用户的输入,外部函数可能需要长达一个小时的时间才能运行。是否可以将其更改为在外部 python 代码开始成功运行时发出一个警报,并在函数完成时发出第二次警报?

我知道将数据发送到 API 时可能会失败,API 可能由于数据类型不匹配而无法访问数据,最后如果数据与外部函数不兼容。我正在寻找异步函数 React 的 3 种不同响应


慕容森
浏览 108回答 2
2回答

小唯快跑啊

export const SendData = (url, props) =>{ //this url is the url to the DataInput api view    const data1 = document.getElementById('data1')    const data2 = document.getElementById('data2')    async function postData() {        var res = ''        const options ={            method : 'POST',            headers: {                'Accept': 'application/json',                'Content-Type': 'application/json;charset=UTF-8'            },            body: JSON.stringify({            data_one: data1,            data_two: data2            })        }        const response = await fetch(url, options)            .then(response => {                if (response.ok) {                    alert("Data Sent!")                }                else {                    alert("An error has occurred.\nWere all fields filled out?")                }            });    }           postData()};models.pyclass DataInput(models.Model):    data_one = models.IntegerField(        max_length=30,        default=5)    data_two = models.IntegerField(        max_length=30,        default=4)class OtherData(models.Model):    other_data = models.IntegerField(        max_length=5,        default=10)@receiver(post_save, sender=DataInput, dispatch_uid="extra function")def extra_function(sender, instance, created, *args, **kwargs):    #dummy function to show reliance on data    for i in OtherData[0].other_data:        print(instance.data_two + instance.data_one)serializer.pyfrom rest_framework import serializersfrom .models import DataInputfrom .models import OtherDataclass DataSerializer(serilizers.ModelSerializer):    class Meta:        model = DataInput        fields = ('data_one', 'data_two')class OtherDataSerializer(serializer.ModelSerializer):    class Meta:        model = OtherData        fields = ('other_data')

汪汪一只猫

最好避免在同一 (http) 连接中同步等待长时间运行的操作的响应。特别是在浏览器中,因为它们可能会导致超时(取决于浏览器,但通常为 1-5 分钟)解决方案之一是使用 HTTP 轮询。该技术的详细解释可以在这里找到:带轮询的长时间运行操作异步请求-应答模式正如您在第二个链接中可以找到的,您的 API 应在开始长时间运行的流程之前验证请求和要执行的操作。如果请求无效,请立即回复错误代码,例如 HTTP 400(错误请求)。在其他情况下,将任务分配给后台工作人员(例如 django-q),并使用反应应用程序可以轮询等待作业结果的位置进行响应。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python