首页 > 解决方案 > ES7 的行为会像这里的函数完全同步吗?

问题描述

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

function wrapperFunction() {

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

}

现在,我希望函数 b 仅在函数 a 已经完成时才启动。我知道我可以通过使 wrapperFunction “异步”轻松地做到这一点,在函数 a 前面使用“await”,然后从函数 a(使用 JQuery Ajax)返回承诺,如下所示:

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

但我想知道一件事:函数 a 本身应该被 JS 视为 SYNCHRONOUS 代码,直到它碰到函数内部的 JqueryAJAX,对吧?只有当它遇到 AJAX 调用时,JS 才会将其交给 C++ API 并继续执行下一段代码,无论 AJAX 调用是否已完成执行,对吧?

所以让我们假设,即使它会是不必要的hacky,我会这样做:

async function a() {

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

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

标签: javascriptjqueryajaxecmascript-2016

解决方案


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

推荐阅读