Javascript将我的Node6 Firebase函数移动到Node8异步/等待模式

时间:2018-11-29 16:06:29

标签: javascript promise async-await

由于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;
  });
};

这可以很好地运行,但是我想异步/等待模式可以简化我的代码...是真的还是我应该坚持当前的代码?

感谢您的反馈

1 个答案:

答案 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对路由回调的返回值不做任何事情),因此诺言不被拒绝很重要。