首页 > 解决方案 > Javascript:为什么 async/await 在这种情况下不起作用,而 setTimeout 工作得很好?

问题描述

我正在解决工作中的一个特定问题,我应该在按下按钮时从后端调用 3 个方法。最初我用 async/await 设置了它,它在我们公司的服务器中本地工作得很好。

这是原始代码:

async function attachDocumentsToForm(file: any, signature: any) {
    let pdfFile = new File([file], `Подписанный_Файл_${formData?.serialNumber}.pdf`, {type:"text/plain"})
    let sigFile = new File([signature], `Подпись_${formData?.serialNumber}.sig`)

    await AttachmentApiClient.attach(
        inquiryId,
        `Подпись_${formData?.serialNumber}.sig`,
        "Прочие документы",
        {
            data: sigFile,
            fileName: `Подпись_${formData?.serialNumber}.sig`
    });

    await AttachmentApiClient.attach(
        inquiryId,
        `Подписанный_Файл_${formData?.serialNumber}.pdf`,
        "Прочие документы",
        {
            data: pdfFile,
            fileName: `Подписанный_Файл_${formData?.serialNumber}.pdf`
    });
    
    await EmployeeApiClient.signInquiry(inquiryId, new SignChiefVm({ isSigned: true, comment: commentText }))

    setOpenedSnackbar(true)
    setIsSigned(true)
}

但是,当应用程序部署到我们客户端的服务器时attach,应该附加 pdf 文件的方法请求失败(似乎前端立即无法附加 pdf 文件,同时 .sig 附加方法工作得很好,无论在哪个命令我给他们每个人打电话)。作为一种解决方法,我使用了 setTimeout,每种方法之间的间隔为 2 秒和 2.5 秒,并且它起作用了。

这是一个新代码:

function attachDocumentsToForm(file: any, signature: any) {
    let pdfFile = new File([file], `Подписанный_Файл_${formData?.serialNumber}.pdf`)
    let sigFile = new File([signature], `Подпись_${formData?.serialNumber}.sig`)

    AttachmentApiClient.attach(
        inquiryId,
        `Подписанный_Файл_${formData?.serialNumber}.pdf`,
        "Прочие документы",
        {
            data: pdfFile,
            fileName: `Подписанный_Файл_${formData?.serialNumber}.pdf`
    });

    setTimeout(() => {
        AttachmentApiClient.attach(
            inquiryId,
            `Подпись_${formData?.serialNumber}.sig`,
            "Прочие документы",
            {
                data: sigFile,
                fileName: `Подпись_${formData?.serialNumber}.sig`
        });
    }, 2500)
    
    setTimeout(() => {
        EmployeeApiClient.signInquiry(inquiryId, new SignChiefVm({ isSigned: true, comment: commentText }))

        setOpenedSnackbar(true)
        setIsSigned(true)
    }, 4500)
}

我已经对其进行了多次测试,它可以正常工作,但在我看来,这样的解决方案非常糟糕。在这种情况下 async/await 不起作用的可能原因是什么?如果不直接为每个请求设置时间,可能的解决方案是什么?

最好的问候,康斯坦丁

PS:前端技术栈 - React & Typescript

标签: javascriptreactjsasynchronousasync-awaitsettimeout

解决方案


推荐阅读