由于Firebase函数现在在Node8上运行,所以我想将当前的ES5函数w在Promise流中转换为ES6异步/等待
我的流程模式如下:
#import <xxx.dll> no_namespace raw_interfaces_only
当前,我正在使用特定的conditionalPromiseFlow()函数,如下所示:((还需要处理错误。.
const AUTHORIZED = authorizedApi()
if AUTHORIZED
const SENT = sendContactMessage())
if SENT
const FOUND = findContact(
if FOUND
return "FINISHED"
if !FOUND
const CREATED = createContact()
if CREATED
return "FINISHED"
我称之为:
const conditionalPromiseFlow = (...fns) => {
if (fns.length === 0) return Promise.resolve();
const [next] = fns;
return next().then(result => {
if (result) {
return conditionalPromiseFlow(...fns.slice(1));
}
return result;
});
};
这可以很好地运行,但是我想异步/等待模式可以简化我的代码...是真的还是我应该坚持当前的代码?
感谢您的反馈
答案 0 :(得分:2)
假设async
函数中未包含 ,则async
/ await
等效项为:
(async() => {
try {
await authorizedApi(jwtClient);
await sendContactMessage(gmailAPI, encodedContactMessage);
await findContact(
googlePeopleAPI.connections,
googleConnectionListParams,
sender.email
);
await createContact(googlePeopleAPI, googlePeopleContactParams);
res.send({ status: 200, infos: "done" });
} catch (error) {
res.send({ status: error.status, infos: error.message });
}
))();
这是否更简单,是否值得进行更改显然取决于您。
(从您的代码中,当这些函数返回的承诺被拒绝时,我认为它们提供的对象上带有status
。)
请注意,我没有将try
/ catch
放在最后一个res.send
周围。我认为不会抛出异常,但是您确实有一个catch
处理程序。因此,如果它抛出了,您想把它放回去。
如果您已经在async
函数中 ,显然您不需要async
包装器:
try {
await authorizedApi(jwtClient);
await sendContactMessage(gmailAPI, encodedContactMessage);
await findContact(
googlePeopleAPI.connections,
googleConnectionListParams,
sender.email
);
await createContact(googlePeopleAPI, googlePeopleContactParams);
res.send({ status: 200, infos: "done" });
} catch (error) {
res.send({ status: error.status, infos: error.message });
}
通过res.send
似乎您使用的是Express框架-因此您可以使处理程序成为异步包装器,将async
一词放在(req, res)
之前就足够了:
app.get('/something', async (req, res) => {
try {
/*
await stuff here
*/
res.send({ status: 200, infos: "done" });
} catch (error) {
res.send({ status: error.status, infos: error.message });
}
});
请注意,在上面和第一个代码块的async
包装器中,整个主体都位于try
中({{1}除外) }错误)。这是因为没有任何东西可以处理来自res.send
函数的诺言(Express对路由回调的返回值不做任何事情),因此诺言不被拒绝很重要。