ES7 会表现得像函数在这里完全同步吗?
Would ES7 behave like the function was fully synchronous here?
以下案例:
我有一个 wrapperfunction "InitializePage()" ,它在加载页面时被调用。
这个包含函数 a-d,其中 a 和 b 包含 AJAX。它看起来像这样:
function wrapperFunction() {
a() //contains AJAX
b() //contains AJAX
c() //Synchronous
d() //Synchronous
}
现在,我希望函数 b 仅在函数 a 已经完成时才启动。
我知道我可以通过制作 wrapperFunction "async"、在函数 a 前面使用 "await" 然后 return 来自函数 a 的承诺(使用 JQuery Ajax) 像这样:
function a() {
return $.post('somefile.php', {
//someCode
})
}
但是我想知道一件事:
函数 a 本身应该被 JS 视为同步代码,直到它命中函数内部的 JqueryAJAX ,对吗?
只有当它命中 AJAX 调用时,JS 才将它交给 C++ API 并继续下一段代码,而不管 AJAX 调用是否已执行完毕,对吧?
所以让我们假设,即使这会是不必要的 hacky,我会这样做:
async function a() {
await $.post('someFile.php', {
//some code
})
}
由于我同步了函数 a() 的 AJAX 部分,这是否意味着在 wrapperFunction() 级别,JS 在函数 a() 及其所有内容完成执行之前不会继续?
async 函数声明定义了一个 asynchronous 函数,return 是一个 AsyncFunction 对象。异步函数是通过事件循环异步操作的函数,使用隐式 Promise 到 return 其结果。但是使用异步函数的代码的语法和结构更像是使用标准同步函数。
所以根据你的问题。
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();
如果我们用 "fully asynchronous" 表示 Event Loop 上没有任何内容,那么不,您的函数 a
不会完全同步。
使用 async/await 不会使异步代码同步,它只是简单的语法,可以帮助开发人员更轻松地推理 Promise,本质上是通过将 Promise API 抽象到语言中。
Since I synchronized the AJAX part of function a(), would this mean that at the level of wrapperFunction(), JS does NOT procede until function a() and all of its contents have finished execution?
请注意,通过使用 async/await,您的函数 a
是 而不是 "synchronized",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')
})
}
以下案例: 我有一个 wrapperfunction "InitializePage()" ,它在加载页面时被调用。 这个包含函数 a-d,其中 a 和 b 包含 AJAX。它看起来像这样:
function wrapperFunction() {
a() //contains AJAX
b() //contains AJAX
c() //Synchronous
d() //Synchronous
}
现在,我希望函数 b 仅在函数 a 已经完成时才启动。 我知道我可以通过制作 wrapperFunction "async"、在函数 a 前面使用 "await" 然后 return 来自函数 a 的承诺(使用 JQuery Ajax) 像这样:
function a() {
return $.post('somefile.php', {
//someCode
})
}
但是我想知道一件事: 函数 a 本身应该被 JS 视为同步代码,直到它命中函数内部的 JqueryAJAX ,对吗? 只有当它命中 AJAX 调用时,JS 才将它交给 C++ API 并继续下一段代码,而不管 AJAX 调用是否已执行完毕,对吧?
所以让我们假设,即使这会是不必要的 hacky,我会这样做:
async function a() {
await $.post('someFile.php', {
//some code
})
}
由于我同步了函数 a() 的 AJAX 部分,这是否意味着在 wrapperFunction() 级别,JS 在函数 a() 及其所有内容完成执行之前不会继续?
async 函数声明定义了一个 asynchronous 函数,return 是一个 AsyncFunction 对象。异步函数是通过事件循环异步操作的函数,使用隐式 Promise 到 return 其结果。但是使用异步函数的代码的语法和结构更像是使用标准同步函数。
所以根据你的问题。
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();
如果我们用 "fully asynchronous" 表示 Event Loop 上没有任何内容,那么不,您的函数 a
不会完全同步。
使用 async/await 不会使异步代码同步,它只是简单的语法,可以帮助开发人员更轻松地推理 Promise,本质上是通过将 Promise API 抽象到语言中。
Since I synchronized the AJAX part of function a(), would this mean that at the level of wrapperFunction(), JS does NOT procede until function a() and all of its contents have finished execution?
请注意,通过使用 async/await,您的函数 a
是 而不是 "synchronized",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')
})
}