Javascript переместил мою функцию Node6 Firebase в Node8 async / await pattern - PullRequest
0 голосов
/ 29 ноября 2018

Поскольку функции Firebase теперь запускаются с Node8, я хотел бы преобразовать мою текущую функцию ES5. W Обещание потока в ES6, асинхронное / ожидание

. Мой шаблон потока выглядит следующим образом:

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"

В настоящее время я использую определенную функцию conditionalPromiseFlow () следующим образом: (необходимо обрабатывать и ошибки ..

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

, и я вызываю ее:

conditionalPromiseFlow(
  () => authorizedApi(jwtClient),
  () => sendContactMessage(gmailAPI, encodedContactMessage),
  () =>
    findContact(
      googlePeopleAPI.connections,
      googleConnectionListParams,
      sender.email
    ),
  () => createContact(googlePeopleAPI, googlePeopleContactParams)
)
  .then(
    res => {
      return { status: 200, infos: "done" };
    },
    error => {
      return { status: error.status, infos: error.message };
    }
  )
  .then(response => {
    return res.send(response);
  })
  .catch(console.error);

, это работает хорошо, ноЯ думаю, что шаблон async / await упростит мой код ... Это правда или я должен придерживаться моего текущего кода?

спасибо за отзыв

1 Ответ

0 голосов
/ 29 ноября 2018

Если предположить, что не содержится в функции 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 кажется, что вы используете экспресс-фреймворк - поэтому вы можете сделать обработчик асинхронной оболочкой, достаточно поставить 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 в первом блоке кода тело whole находится в try (кроме res.send в случае ошибки).Это потому, что ничто не будет обрабатывать обещание из функции async (Express ничего не делает с возвращаемым значением обратных вызовов маршрута), поэтому важно, чтобы обещание не отклонялось.

...