Javascript 异步/等待时间';t等待上一个功能完成
我正在构建一个web应用程序,它需要多次查询我的数据库,每次都从第一次数据库调用获取数据以进行下一次调用。在这种情况下,我需要等到上一次通话结束后再继续。异步/等待不是正确的方法吗?如果是的话,我在这里错过了什么Javascript 异步/等待时间';t等待上一个功能完成,javascript,ajax,async-await,Javascript,Ajax,Async Await,我正在构建一个web应用程序,它需要多次查询我的数据库,每次都从第一次数据库调用获取数据以进行下一次调用。在这种情况下,我需要等到上一次通话结束后再继续。异步/等待不是正确的方法吗?如果是的话,我在这里错过了什么 var firstCall = new XMLHttpRequest(); var firstCallData; async function sendFirstCall() { firstCall.open('GET', queryURL); firstCall.onload
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函数没有返回一个
承诺
(无论如何都不是一个特别有意义的承诺),因此没有什么需要等待的
。我不知道<代码> XMLHttpRequest <代码>是否有任何现代<代码>承诺>代码>功能(工具如<代码> FETCH < /COD>或AXIOS,您可以考虑查看这些代码),但您可以将其封装在<代码>承诺< /代码>中。也许是这样的:
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,只是手动返回一个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();
这样,操作本身就没有副作用,它只是(异步地)产生一个值,并且使用代码决定如何处理该值
如果
XMLHttpRequest
失败或导致错误代码,您还可以使用Promise
中的reject
回调来处理错误。否则,失败/错误将丢失,Promise
将永远无法解析或拒绝。您的sendFirstCall
函数不会返回一个Promise。@事实上,Pointy id会返回一个Promise(因为它是异步的),但它是一个Promise
函数,它是自动解析的。@derpirscher是的,完全正确。