ES7的行为会像这里的函数是完全同步的吗



以下情况:我有一个wrapperfunction"InitializePage((",它是在加载页面时调用的。这一个包含函数a-d,其中a和b包含AJAX。它看起来是这样的:

function wrapperFunction() {
a() //contains AJAX
b() //contains AJAX
c() //Synchronous
d() //Synchronous
}

现在,我希望函数b只有在函数a已经完成的情况下才开始。我知道我可以很容易地做到这一点,方法是将wrapperFunction设置为"async",在函数a前面使用"wait",然后从函数a返回promise(使用JQueryAjax(,如下所示:

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

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

因此,让我们假设,即使这是不必要的黑客行为,我也会这样做:

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

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

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

如果我们将"完全异步"视为事件循环中没有任何内容,那么不,您的函数a将不会变得完全同步。

使用async/await并不能使异步代码同步,只是语法帮助开发人员更容易地推理Promise,主要是通过将Promise API抽象到语言中。

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

注意,函数a不是通过使用async/await"同步"的,a的调用方仍然可以等待其执行完成,然后再继续执行下一条语句,但前提是使用await关键字调用a,如下图所示:

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

最新更新