Будет ли ES7 вести себя так, как если бы функция была полностью синхронной? - PullRequest
0 голосов
/ 19 ноября 2018

В следующем случае: у меня есть функция-обертка InitializePage (), которая вызывается при загрузке страницы.Этот содержит функции ad, из которых a и b содержат AJAX.Это будет выглядеть так:

function wrapperFunction() {

  a() //contains AJAX
  b() //contains AJAX
  c() //Synchronous
  d() //Synchronous

}

Теперь я хочу, чтобы функция b запускалась, только если функция a уже завершена.Я знаю, что я мог бы легко сделать это, сделав wrapperFunction «async», использовать «await» перед функцией a, а затем вернуть обещание из функции a (используя JQuery Ajax) следующим образом:

function a() {
  return $.post('somefile.php', {
    //someCode
  })
}

Но я хочу знать одну вещь: сама функция a должна обрабатываться JS как СИНХРОННЫЙ код, пока не достигнет JqueryAJAX внутри функции, верно?Только когда он выполняет вызов AJAX, JS передает его API C ++ и переходит к следующему фрагменту кода независимо от того, завершил ли еще вызов AJAX выполнение или нет, верно?

Итак, давайте предположим, что дажехотя это было бы излишне хакерским, я бы сделал это:

async function a() {

  await $.post('someFile.php', {
    //some code
  })
}

Поскольку я синхронизировал AJAX-часть функции a (), это означало бы, что на уровне wrapperFunction () JS НЕ будет работать дофункция a () и все ее содержимое завершено?

Ответы [ 2 ]

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

Если мы возьмем «полностью асинхронный», что означает, что в Event Loop ничего не положено, то нет, ваша функция a не станет полностью синхронной.

Использование async / await не делает асинхронный код синхронным, это просто синтаксис, который помогает разработчику легче рассуждать с Promises, в основном путем абстрагирования API Promise в язык.

Поскольку я синхронизировал часть AJAX функции a (), будет ли это означать, что на уровне wrapperFunction () JS НЕ будет работать до тех пор, пока функция a () и все ее содержимое не завершит выполнение?

С предупреждением о том, что ваша функция a не"синхронизирована" с использованием async / await, вызывающие a все еще могут ждать завершения своего выполнения, прежде чем переходить к следующему оператору, но только если вызов a сделан с использованием ключевого слова await, например:

async function a () {
  return someAsyncOperation()
}

async function waitsOnA () {
  console.log('a started')
  await a()
  console.log('a completed')
}

// equivalent to
function waitsOnA () {
  console.log('a started')
  a().then(() => {
    console.log('a completed')
  })
}
0 голосов
/ 19 ноября 2018

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

Так что по вашему вопросу.

async function a() {

  await $.post('someFile.php', {
    //some code
  })
}

да, это делает его асинхронным. но всегда лучше использовать await там, где мы вызываем эту функцию, как показано ниже.

для получения дополнительной информации, пожалуйста, посмотрите здесь .

function resolveAfter2Seconds() {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve('resolved');
    }, 2000);
  });
}

async function asyncCall() {
  console.log('calling');
  var result = await resolveAfter2Seconds();
  console.log(result);
  // expected output: 'resolved'
}

asyncCall();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...