我刚刚开始使用Java语言学习Promise
,并偶然遇到了async/await
。
据我了解,如果我将一个函数指定为async
,则javascript将始终包装函数的内容并返回Promise
而不是返回的内容。
我们假定以下情况:
async function httpRequest() {
oReq = new XMLHttpRequest();
oReq.addEventListener("load", function() {
return this.responseText;
});
oReq.open("GET", "http://some.url.here");
oReq.send();
}
httpRequest().then(function(httpResult) {
console.log(httpResult);
});
我是否正确地假设上述情况将不起作用,因为httpRequest()
未返回任何内容,XMLHttpRequest
的回调仅返回了某些内容,因此我的结果很可能是{{1 }}?
如果可以,我将如何解决undefined
使其在httpRequest()
情况下工作?
答案 0 :(得分:2)
这里提供的是一个执行异步操作的异步函数,该操作不使用promise。这意味着您需要设置一个函数来显式管理和返回承诺。您不需要此处的async
关键字,因为您想显式地return
创建的Promise
,而不是由async关键字(不能直接为您创建)创建的承诺管理)。
function httpRequest() {
// Return a promise (this is what an async function does for you)
return new Promise(resolve => {
const oReq = new XMLHttpRequest();
oReq.addEventListener("load", function() {
// Resolve the promise when the async operation is complete.
resolve(this.responseText);
});
oReq.open("GET", "http://some.url.here");
oReq.send();
};
}
现在该函数显式返回一个promise,可以像await
函数一样async
编辑它。或像其他承诺一样与then()
一起使用。
async function someFunction() {
// await
const awaitedResponse = await httpRequest();
console.log(awaitedResponse);
// or promise chain
httpRequest().then(responseText => console.log(responseText));
};
答案 1 :(得分:-1)
基本上,您正在尝试编写一个async
函数,而该函数中没有任何等待的内容。当代码中存在某种异步性时,您可以使用async / await;而在您的代码中则没有异步性。
这是一个可能有用的示例:
const getItemsAsync = async () => {
const res = await DoSomethingAsync();
return res.items;
}
const items = await getItemsAsync();
如您所见,DoSomethingAsync
是一个等待结果的异步函数,res
。此时,代码将暂停。一旦诺言得以解决,代码将恢复并因此返回res.items
,这意味着items
实际上将包含异步函数的结果。
此外,async / await只是一种空间语法,通过赋予其更同步的形式(而不是实质内容)来使代码更具可读性。
如果您真的想使其异步,则可以使同步代码合理化,以使其返回等待的诺言,然后将其解决或拒绝。