javascript - 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() 及其所有内容都完成执行后才会继续执行?
解决方案
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();
推荐阅读
- glsl - 使用 pixi-js 在 GLSL 中进行纹理缩放
- javascript - GoJS 调整图表每个元素的大小
- html - 两个相同的html元素有不同的尺寸
- python - 查找 Xpath 对每个登录都是唯一的元素
- python - 如何在pdf中提取输入字段的x0,y0坐标
- flutter - 在 DataTable 中显示所选单元格的详细数据
- java - 带有@Param null 参数的 JPA 仍然抛出错误
- javascript - 如何重新启动已设置间隔的倒数计时器?Javascript
- azure - 如何将 Ubuntu VM 从 Digital Ocean 迁移到 Azure
- reactjs - 材质 UI 工具提示未在嵌套组件上呈现