Зачем использовать asyn c без ожидания в Javascript? - PullRequest
0 голосов
/ 12 января 2020

Я видел очень много людей, определяющих асинхронную c функцию без использования в ней await следующим образом.

async function authMiddleware(req, res, next) => {
  try {
    const token = req.query.token
    const secret = process.env.JWT_SECRET
    jwt.verify(token, secret)
  } catch (err) {
    return res.status(403).json({ message: MESSAGES.TOKEN_EXPIRED })
  }
  return next()
}

Я прикрепил этот код только для примера. Пожалуйста, не волнует значение линий внутри.

Есть ли хороший смысл или случай использования определения функции asyn c без await в javascript?

Возможно: возможно ли, что он намеревался сообщить пользователь что вернет обещание?

Ответы [ 4 ]

0 голосов
/ 12 января 2020

Для приведенного примера кода, я предполагаю, что разработчик намеревался сделать его асинхронным (не блокируя событие-l oop) в будущем, но он не знал простого способа сделать это. Дело в том, что jwt.verify не предоставляет API на основе Promise, он принимает необязательный третий параметр обратного вызова, и в этом случае он будет выполняться асинхронно. Снова Я думаю, разработчик не был уверен в использовании API обратного вызова, или он был религиозен в отношении использования async/await везде, где это возможно.

Возможное решение с использованием async/await может заключаться в обещание jwt.verify и await для этого обещанного вызова функции:

const verifyJwtAsync = Bluebird.promisify(jwt.verify);

async function authMiddleware(req, res, next) => {
  try {
    const token = req.query.token
    const secret = process.env.JWT_SECRET
    await verifyJwtAsync(token, secret)
  } catch (err) {
    return res.status(403).json({ message: MESSAGES.TOKEN_EXPIRED })
  }
  return next()
}

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

async function authMiddleware(req, res, next) => {
    const token = req.query.token
    const secret = process.env.JWT_SECRET
    jwt.verify(token, secret, function(err) {
       if (err) res.status(403).json({ message: MESSAGES.TOKEN_EXPIRED });
       else next();
    })
}
0 голосов
/ 12 января 2020

Что говорит ESLint со своим правилом require-await .

Асинхронные функции в JavaScript ведут себя не так, как другие функции, двумя важными способами:

  • Возвращаемое значение всегда является Обещанием.
  • Вы можете использовать оператор await внутри них.

Основная причина для использования асинхронных функций обычно заключается в использовании оператора await, ...

What MDN говорит:

Объявление функции asyn c определяет асинхронную функцию - функцию, которая возвращает объект AsyncFunction. Асинхронные функции работают в отдельном порядке, чем остальная часть кода, через событие l oop, возвращая неявное Promise в качестве его результата. Но синтаксис и структура кода, использующего функции asyn c, выглядят как стандартные синхронные функции.

Понятно, что функции asyn c предназначены не только для ожидающего использования, Тогда, не имея ожидания в asyn c функция в порядке. Но ... какой в ​​этом смысл?

Я считаю, что стоит использовать синхронную функцию, такую ​​как Promise. Следующий пример из javascript .info .

async function f() {
  return 1;
}

f().then(alert); // 1

будет таким же, как:

async function f() {
  return Promise.resolve(1);
}

f().then(alert); // 1

Есть ли какая-нибудь хорошая точка определяя функцию как asyn c безо всякой причины в javascript?

Она может использоваться для того, чтобы сделать код более читабельным или простым для отслеживания.

Результаты на стороне клиента будут не быть затронутым.

0 голосов
/ 12 января 2020

Вышеописанный код предназначен для возврата неявного Обещания в качестве его результата.

Как и

async function firstFunction(a , b) {
   do some stuff here.....
}
function secondFunction(res){
 do some stuff here.....
}
async function thirdFunction(items){
 const data = await fetch('url here');
 const result = await data.json();
 do some stuff here........
}

, так что сделка ... .

firstFunction (2,3). затем ((resOfFirst) => secondFunction (resOfFirst)). затем ((resOfSecond) => thirdFunction (resOfSecond))

Надеюсь, это поможет.

0 голосов
/ 12 января 2020

Для показанного вами кода он не имеет никакого смысла, поскольку он - по крайней мере, я предполагаю - промежуточное программное обеспечение express, а expressjs не использует возвращенное обещание этого промежуточного программного обеспечения. И без await в этом async промежуточном программном обеспечении изменяется только то, что промежуточное программное обеспечение возвращает Promise, и, поскольку expressjs не использует возвращенный Promise, поэтому ключевое слово async здесь бессмысленно и даже вредно, если что-то в authMiddleware выдает некэшированную ошибку.

И использовать ее without any reason не имеет смысла. Вы можете использовать async и await, чтобы преобразовать длительно выполняющийся синхронный процесс в более мелкие куски, чтобы другой код мог чередоваться, так как await / async позволяет вам вводить некоторую совместную многозадачность. Но только добавление await / async к одной только длительной задаче не помешает вам заблокировать событие l oop.

Если у вас есть такой код:

function testA() {
   for( let i=0 ; i<10 ; i++) {
      console.log('testA', i)
   }
}

function testB() {

   for( let i=0 ; i<10 ; i++) {
      console.log('testB', i)
   }
}

testA();
testB();

console.log('finished');

Тогда вы можете использовать await и async, чтобы разрешить чередование другого кода, изменив его на.

async function testA() {
  for (let i = 0; i < 10; i++) {
    console.log('testA', await i)
  }
}

async function testB() {

  for (let i = 0; i < 10; i++) {
    console.log('testB', await i)
  }
}

Promise.all([
  testA(),
  testB()
]).then(() => {
  console.log('finished');
})
...