开发者社区> 问答> 正文

如何在 云函数中异步调用另一个云函数,无需等待另一个云函数返回结果

如何在 云函数A 中异步调用 云函数B,其中B涉及延时操作。 云函数A 调用 B 后,立即返回结果。无需等待 B 执行完毕。

展开
收起
游客6666666666 2022-12-06 15:00:34 358 0
1 条回答
写回答
取消 提交回答
  • EMAS Serverless

    开发者您好,目前云函数还不提供异步调用模式,但是您可以通过以下方式实现类似效果。

    首先定义函数B,执行一个五秒的任务:

    module.exports = async (ctx) => {
        ctx.logger.info(`B running: ${Date.now()}`)
        await sleep(5000)
        ctx.logger.info(`B finished: ${Date.now()}`)
    };
    
    const sleep = ms => new Promise(r => setTimeout(r, ms));
    

    定义函数A,在A中我们需要拉起函数B,但是不关注B的运行结果:

    module.exports = async (ctx) => {
        ctx.logger.info(`A start: ${Date.now()}`)
        // 拉起函数B,注意前面不加 await
        ctx.mpserverless.function.invoke('functionB', {x: 1, y:2})
        // 这一步是必须的,因为需要等待拉起函数B的请求发出去
        await sleep(2000)
        ctx.logger.info(`A end: ${Date.now()}`)
    };
    
    const sleep = ms => new Promise(r => setTimeout(r, ms));
    

    值得注意的是,我们在A中异步拉起函数B之后,加了个固定时间等待,这是因为如果不加等待,函数A运行结束会立即冻结,此时拉起函数B的请求可能还来不及发送出去。

    最后,开发者需要知道凡是从SDK发起的函数运行请求最多只支持10S运行时间,如果您需要函数运行更长时间,可以使用定时任务来触发运行函数,此时最多支持600S运行时间。

    2022-12-12 11:42:21
    赞同 1 展开评论 打赏
来源圈子
更多
收录在圈子:
基于阿里巴巴以及合作伙伴的最佳实践,围绕大前端、云原生领域的相关技术热点(小程序、Serverless、应用中间件、低代码、DevOps)展开行业探讨,与开发者一起探寻云原生时代应用研发的新范式。
问答排行榜
最热
最新

相关电子书

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