ES7的行为是否像这里的功能完全同步一样?

时间:2018-11-19 09:20:14

标签: javascript jquery ajax ecmascript-7

以下情况: 我有一个包装函数“ InitializePage()”,在加载页面时会调用该函数。 这个包含a-d函数,其中a和b包含AJAX。看起来像这样:

function wrapperFunction() {

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

}

现在,我希望函数b仅在函数a已经完成时才能启动。 我知道我可以很容易地做到这一点,方法是使wrapperFunction“ async”,在函数a前面使用“ await”,然后从函数a返回承诺(使用JQuery Ajax),如下所示:

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

但是我想知道一件事: 函数a本身应该被JS视为SYNCHRONOUS代码,直到它到达函数内部的JqueryAJAX为止,对吗? JS仅在遇到AJAX调用时,才将其交给C ++ API并继续执行下一部分代码,而不管AJAX调用是否已完成执行,对吗?

因此,让我们假设,即使它不必要地受到黑客攻击,我也会这样做:

async function a() {

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

自从我同步了函数a()的AJAX部分以来,这是否意味着在wrapperFunction()级别上,直到函数a()及其所有内容完成执行后,JS才继续进行?

2 个答案:

答案 0 :(得分:1)

异步函数声明定义了异步函数,该函数返回 AsyncFunction 对象。异步函数是通过事件循环异步运行的函数,使用隐式的 Promise 返回其结果。但是,使用异步函数的代码的语法和结构更像使用标准同步函数。

根据您的问题。

async function a() {

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

是的,它使它异步。但是总是最好使用await来调用此函数,如下所示。

有关更多信息,请查看here

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

答案 1 :(得分:0)

如果我们使用“完全异步”来表示Event Loop上没有任何内容,则否,那么您的函数a将不会变得完全同步。

使用async / await不会使异步代码同步,而仅仅是通过语法将Promise API抽象为语言,从而可以帮助开发人员更轻松地与Promises进行推理。

  

自从我同步了函数a()的AJAX部分以来,这是否意味着在wrapperFunction()级别上,直到函数a()及其所有内容完成执行后,JS才继续进行?

请注意,通过使用异步/等待,您的函数a不是 被“同步”的,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')
  })
}