我花了几个小时试图让它发挥作用,但它没有明显的理由。我有所有必需的包和设置。我没有收到任何错误,async
和await
只是等不及。
我使用Webpack来要求Babel添加的polyfill文件,例如 babel-runtime/regenerator
。
async function getData() {
let data = await ajaxCall();
console.log(data);
}
function ajaxCall() {
let url = 'https://maps.googleapis.com/maps/api/geocode/json?address=london';
let xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == XMLHttpRequest.DONE) {
if(xmlhttp.status == 200) {
console.log(JSON.parse(xmlhttp.response));
return JSON.parse(xmlhttp.response);
}
}
}
xmlhttp.open('GET', url, true);
xmlhttp.send();
}
getData();
// It logs "undefined" and then ajax response AFTER
{
"presets": ["es2015", "stage-0"],
"plugins": ["transform-runtime"]
}
有谁知道可能出现什么问题?
答案 0 :(得分:3)
为了使async
和await
能够工作,您需要从await
ed调用返回一些内容,JS运行时可以使用它来知道何时继续{{1}的函数1}结果。 await
/ async
互操作所需的“类型”称为Promise
。
你的await
返回ajaxCall
,它不会告诉JS运行时任何东西,因此它不会undefined
,因为没有什么可以等待的。如果您想要完成这项工作,只需从await
返回Promise
并在满足您的ajax请求时解决此问题。
最简单的:
ajaxCall
或使用function ajaxCall() {
let url = 'https://maps.googleapis.com/maps/api/geocode/json?address=london';
// The new `window.fetch` API returns a promise for you
return fetch(url).then(response => response.json());
}
:
XMLHttpRequest
答案 1 :(得分:1)
您需要从ajaxCall()返回一个promise。 代码看起来应该是这样的:
function ajaxCall() {
return new Promise((resolve, reject) => {
let url = 'https://maps.googleapis.com/maps/api/geocode/json?address=london';
let xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == XMLHttpRequest.DONE) {
if(xmlhttp.status == 200) {
console.log(JSON.parse(xmlhttp.response));
resolve(JSON.parse(xmlhttp.response));
}
}
// handle error: reject(error);
}
xmlhttp.open('GET', url, true);
xmlhttp.send();
})
}
然后:
async function getData() {
try {
let data = await ajaxCall();
console.log(data);
} catch (e) {
// do something with error
}
}
请注意,我使用了es6箭头功能