所以我一直很高兴地使用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?
});
有人知道吗?
要查看问题的代码解决方案,请查看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。
你用你的示例代码搞定了它。
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(结果)
,所以不需要等待。
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函数,常规写法会陷入层层嵌套的窘境,不利于维护。