javascript - Async/Await 不等待前一个函数完成
问题描述
我正在构建一个需要多次查询我的数据库的网络应用程序,每次都从第一个数据库调用中获取数据以进行下一次调用。既然如此,我需要等到上一个通话完成后再继续。async/await 不是正确的方法吗?如果是这样,我在这里错过了什么?
var firstCall = new XMLHttpRequest();
var firstCallData;
async function sendFirstCall() {
firstCall.open('GET', queryURL);
firstCall.onload = function() {
firstCallData = JSON.parse(firstCall.responseText);
};
firstCall.send();
};
async function logData() {
await sendFirstCall();
console.log(firstCallData);
}
logData();
我对 JS 并不完全陌生,但我不经常写它,而且我绝对不熟悉 async/await 的工作原理。任何帮助表示赞赏!
解决方案
该sendFirstCall
函数没有返回 a Promise
(无论如何也不是特别有意义的),所以没有什么 to await
. 我不知道是否XMLHttpRequest
有任何现代Promise
功能(像fetch
Axios 或 Axios 之类的工具,您可能会考虑研究这些功能),但您可以将其包装在Promise
. 也许是这样的:
function sendFirstCall() {
return new Promise(function(resolve, reject) {
firstCall.open('GET', queryURL);
firstCall.onload = function() {
firstCallData = JSON.parse(firstCall.responseText);
resolve();
};
firstCall.send();
});
}
请注意,我还async
从函数定义中删除了 。这里并没有真正使用 async/await,只是手动返回 a Promise
(它本身是可等待的,因此消费代码仍然可以使用await
)。
或者,也许更习惯地说,它Promise
本身可以解析为数据:
function sendFirstCall() {
return new Promise(function(resolve, reject) {
firstCall.open('GET', queryURL);
firstCall.onload = function() {
resolve(JSON.parse(firstCall.responseText));
};
firstCall.send();
});
}
那么消费代码将是:
firstCallData = await sendFirstCall();
这样操作本身就没有副作用,它只是(异步)产生一个值,而消费代码决定如何处理该值。
如果失败或导致错误代码,您还可以使用reject
回调中的回调Promise
来处理错误。XMLHttpRequest
否则,失败/错误只会丢失,Promise
永远不会解决或拒绝。
推荐阅读
- typescript - 将枚举转换为打字稿中的键值对对象
- php - 如何替换此 css 解析函数上的点/主题标签和空格?
- perforce - Perforce 从资源管理器中删除文件,如何同步?
- php - Magento 2.3.5:使用自定义选项和价格将产品添加到购物车
- python - 从图表/UML/可视化表示生成 Python 代码
- reactjs - 运行 npx create-react-app 时卡住了,我该如何解决?
- python - 如何在 django 上添加评论
- java - 如何在具有私有构造函数的类中测试此静态成员?
- java - 在 netbeans (Java) 的计算器中使用 ^ 运算符时遇到问题
- google-chrome - 使用 chrome.identity.getAuthToken 进行 OAuth 验证