以下情况: 我有一个包装函数“ 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才继续进行?
答案 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')
})
}