当前位置: 首页 > 知识库问答 >
问题:

在Firebase云函数中使用async/await时返回promise

甄坚白
2023-03-14

所以我一直很高兴地使用async/await,因为Firebase云函数支持节点8。不过我有一件事要做。当使用可调用函数时,会告诉您必须在函数中返回promise,否则它将无法正常工作。当使用原始promise时,我很清楚如何使用它:

exports.createBankAccount = functions.region('europe-west1').https.onCall((data, context) => {
    return promiseMethod().then((result) => {
        return nextPromise(result);
    }).then((result) => {
        return result;
    }).catch((err) => {
        // handle err
    })
});

但是现在,随着异步等待,我不确定如何返回这个“promise链”:

exports.createBankAccount = functions.region('europe-west1').https.onCall(async (data, context) => {
    const res1 = await promiseMethod();
    const res2 = await nextPromise(res1);
    return res2;
    // ??? Where to return the promise?
});

有人知道吗?

共有3个答案

吕森
2023-03-14

要查看问题的代码解决方案,请查看dshukertjr的答案。

如果您想了解如何使用async/wait返回“promise链”,以下是您的答案:

你不能!为什么?因为wait用于等待promise完成。一旦等待回报,他们的价值就不再是promise。

因此,如果您绝对想使用wait返回一个promise,您可以等待两个返回promise的函数之一,但不能同时返回两个。

这里有两种方法可以做到这一点:

A:

exports.createBankAccount = functions.region('europe-west1').https.onCall(async (data, context) => {
    try {
        const result = await promiseMethod();
        return nextPromise(result); // You are returning a promise here
    }catch(e) {
        // handle error here
    }
});

B:

exports.createBankAccount = functions.region('europe-west1').https.onCall(async (data, context) => {
    return promiseMethod().then(async (result) => {
        return await nextPromise(result);
    }).catch((err) => {
        // handle err
    })
});

A和B之间的唯一区别是A在返回Promise之前等待“Promisemethod”完成。而B在被调用后立即返回一个promise。

东门深
2023-03-14

你用你的示例代码搞定了它。

Async/await只是一种新的promise方式。它们可以互换使用。

下面是同一个函数的一个例子,分别是promise和异步/等待。

这个啊

exports.createBankAccount = functions.region('europe-west1').https.onCall((data, context) => {
    return promiseMethod().then((result) => {
        return nextPromise(result);
    }).catch((err) => {
        // handle error here
    })
});

相当于:

exports.createBankAccount = functions.region('europe-west1').https.onCall(async (data, context) => {
  try {
    const result = await promiseMethod();
    return nextPromise(result); // You are returning a promise here
  }catch(e) {
    // handle error here
  }
});

请注意,在这两种情况下,您都在最后返回一个promise。这个onCall函数的返回值将是nextPromise(结果)的任何值。由于返回的是nextPromsie(结果),所以不需要等待。

樊运乾
2023-03-14

HTTP函数不返回promise。他们只是发送一个结果。您仍然必须正确使用promise才能发送结果,但不需要返回值。HTTP函数在发送响应时终止。有关更多详细信息,请参阅文档:

使用res.redirect()、res.send()或res.end()终止HTTP函数。

 类似资料:
  • 编辑:在测试用例5中,任务似乎处于状态。 我在.NET 4.5中使用System.net.http.HttpClient时遇到了一些奇怪的行为--其中“等待”调用的结果(例如)将永远不会返回。 只有在使用新的Async/Await语言功能和任务API的特定情况下才会出现这种情况--代码似乎总是在只使用延续时工作。

  • 我有以下firebase云功能: 当该函数被激发时,它应该从对的异步await调用中获取alert_ad的值。然而,当运行该程序时,我在云函数日志中发现一个错误,说明它是未定义的。我不知道为什么会这样。 我如何测试或记录这一点,以确保async/await实际上获得了一个值?

  • 问题内容: 为了熟悉,我在Chrome中尝试了以下代码: 但不保存结果(字符串);而是持有一个需要再次等待的。这段代码确实给了我响应字符串: 如何使用await从函数返回实际的响应字符串? 问题答案: 要么 要么 这只是编写相同逻辑的另一种方法。

  • > < li >我在组织的租户azure环境中部署了一个ASP.NET(4.5)网站。 < li >它具有从网络位置(我们称之为nas驱动器)上传/下载/删除文件(任何类型)的功能,例如\nas8782\xyz\abc\ < li> 上传/下载/删除工作正常(参见下面的代码)。我们用的是CloudSdk。由我们的Azure团队创建的Azure库。 nasClient.UploadAsync nas

  • 我正在尝试用Async/Await进行一些动态数据建模。我有两个endpoint,第一个将返回对象数组。数组中的这些实体具有从另一个endpoint获取的子实体。 所以我试图实现的结果类似于: 这就是我试图解决这个问题的方法: 我所期待的: 我得到的是: 我不知何故监督了我的承诺.所有链,所以我只是在我的数据对象中获得解析的承诺,有没有关于如何在其中获得普通数据的提示?或者如何将一个数组解析的承诺

  • 如上述示例代码,a是常规的Promise写法,现在想要改成b那样的async写法,请问该怎么办? 想要这么改的原因是函数内部的逻辑逐渐复杂,会调用多个Promise函数,常规写法会陷入层层嵌套的窘境,不利于维护。