开发者社区> 问答> 正文

一个关于宜搭的异步请求的问题

我在宜搭建了一个自定义页面,里面放了一个表格用来展示一个流程表单的数据,那么我现在是想把这个流程表单中每一项实例的审批流程也对应的展示在这个表格上,所以我在请求表单数据的远程API(以下简称getData函数)的fit回调里去请求每一项实例的审批流程信息,我想着是把请求回来的审批信息,给挂到请求表单数据的远程API的返回结果上一起返回,毕竟我那个表格的数据源绑的就是我请求表单数据的远程API,结果请求回来的数据完全拿不到,应该是异步请求的原因我的页面渲染的时候审批流程信息还没挂上去,就导致我页面拿不到数据,就很烦

展开
收起
游客kwinism27dh5i 2023-05-05 18:15:15 148 0
4 条回答
写回答
取消 提交回答
  • 值得去的地方都没有捷径

    你遇到的问题是异步请求导致的渲染问题。异步请求的回调函数是在请求完成后才执行,所以在getData函数返回结果之前是无法获得审批信息的。

    一种解决方法是,你可以在请求表单数据的远程API的fit回调函数里面,获取到数据后,再利用Promise.all()函数去请求每一项实例的审批流程信息,并把它们存储在一个对象中。等到所有的审批流程信息都获取到之后,再把整个对象返回给表格数据源。这样,即使审批信息还没获取到,页面也可以正常渲染,等到异步请求完成后再展示审批信息。

    下面是一个简单的示例代码:

    async function getData() { let formData = await fetchFormData(); let approvalData = await fetchApprovalData(formData); return { formData, approvalData }; }

    async function fetchApprovalData(formData) { let promises = formData.map(item => fetchApprovalDataAsync(item.id)); let approvalData = await Promise.all(promises); return approvalData; }

    async function fetchApprovalDataAsync(id) { let response = await fetch(http://api.example.com/approval/${id}); let data = await response.json(); return data; } 在这个示例中,fetchFormData()函数用来获取表单数据,fetchApprovalData()函数用来获取每一项实例的审批流程信息,fetchApprovalDataAsync()函数则是一个单独请求审批信息的异步函数。最后在getData()函数中返回一个包含formData和approvalData的对象。

    注意,以上代码是一个简单的示例,具体实现需要根据你的实际情况修改。

    2023-05-06 17:00:51
    赞同 展开评论 打赏
  • 您好,您的问题是关于异步请求数据后如何在页面上渲染的问题。为了解决这个问题,您可以使用 Promise 对象或 async/await 方法来处理异步请求。

    具体来说,您可以将请求表单数据和审批流程信息分别封装成 Promise 对象,并使用 Promise.all() 方法来等待两个 Promise 对象都 resolved 后再进行下一步操作。代码示例:

    const getFormData = () => { return new Promise((resolve, reject) => { // 获取表单数据 const formData = getData(); // getData 是您远程 API 请求函数的简称 resolve(formData); }); }

    const getProcessInfo = (instanceId) => { return new Promise((resolve, reject) => { // 获取某个实例的审批流程信息 // 这里的 instanceId 是您获取实例 ID 的方式,可能需要根据实际情况进行修改 const processInfo = getProcessData(instanceId); // getProcessData 是您的获取实例审批流程信息的函数 resolve(processInfo); }); }

    Promise.all([getFormData(), getProcessInfo(instanceId)]).then(([formData, processInfo]) => { // 将审批流程信息挂到表单数据中 formData.processInfo = processInfo; // 渲染页面 renderTable(formData); }).catch((error) => { console.error(error); }); 另外,您也可以使用 async/await 方法来改写上述代码:

    const getDataWithProcessInfo = async (instanceId) => { const formData = await getFormData(); const processInfo = await getProcessInfo(instanceId); formData.processInfo = processInfo; return formData; }

    getDataWithProcessInfo(instanceId).then((formDataWithProcessInfo) => { renderTable(formDataWithProcessInfo); }).catch((error) => { console.error(error); }); 使用 async/await 更加简洁明了,但需要注意的是需要在包含该代码块的函数前面添加 async 关键字。

    2023-05-06 09:26:34
    赞同 展开评论 打赏
  • 十年摸盘键,代码未曾试。 今日码示君,谁有上云事。

    宜搭中创建并部署自定义页面的具体流程,可以参考 TodoMVC 的功能,TodoMVC 大概有以下功能:

    创建待办任务- 用户在任务输入框中填写任务内容,点击回车键,会在任务列表中创建一条待完成的任务;

    更新状态- 用户通过点击任务控制器,更改当前任务的完成状态(若已完成,任务文案将会被横线划掉);

    编辑任务内容- 用户点击任务 Edit 按钮,唤起任务内容输入框,用户可以进行内容更改并点击回车键进行提交(官方的 TodoMVC 是采用双击的方式切换任务编辑状态,由于宜搭暂未开放双击事件,因此使用按钮方式进行编辑态切换),

    删除待办任务- 用户点击 Delete 按钮,删除指定的待办任务; 统计未完成数量- 在页面左下角显示当前未完成的待办任务的统计数量;

    根据状态筛选- 用户通过切换页面底部的筛选器显示不同的任务列表:

    All - 显示所有任务列表; Active - 显示待完成的任务列表; Completed - 显示已完成的任务列表; 清空完成状态的待办任务- 用户通过点击页面右下角的 Clear completed 按钮批量删除所有已完成的任务;

    2023-05-05 18:36:30
    赞同 1 展开评论 打赏
  • 随心分享,欢迎友善交流讨论:)

    有没有尝试过使用Promise.all()方法来处理异步请求,确保所有数据都请求完毕后再进行渲染的办法呢?

    2023-05-05 18:18:12
    赞同 展开评论 打赏
问答分类:
问答地址:
关联地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载