我正在编写一个小的JS脚本,用户在其中输入IBAN,然后输入前12个字符后,我从另一个URL请求银行名称和BIC。由于必须等待此请求完成,因此使函数异步,并在请求中添加了“ await”。但是,我的脚本不再编译并出现以下错误:“解析错误:await是保留字”,指向我新添加的“ await”。由于这种“等待”是在多个if条件内,因此我认为这可能是问题所在。但是,如果有条件,它必须位于这些内部。那么,有谁知道我在做错什么,以及如何在if条件下进行等待?
这是我的代码:
function requestBICandBankname(country, bban) {
return new Promise(function (resolve, reject) {
const xhr = new XMLHttpRequest();
const url = URL + country.toUpperCase() + '/' + bban;
xhr.open('GET', url, true);
xhr.onload = function () {
if (this.status >= 200 && this.status < 300) {
return resolve(xhr.response);
}
return reject({
status: this.status,
statusText: xhr.statusText
});
};
xhr.onerror = function () {
return reject({
status: this.status,
statusText: xhr.statusText
});
};
xhr.send();
});
}
async function initLookup() {
const ibanData = document.getElementById('iban-details');
let country = '';
let bban;
if (ibanData !== null) {
ibanData.oninput = function (event) {
const iban = ibanData.value;
if (iban.length === 12) {
country = iban.substr(0, 2);
bban = iban.substr(4, 12);
try {
const bankdata = await requestBICandBankname(country, bban);
console.log('bankdata', bankdata);
} catch (err) {
console.log(err);
}
}
};
}
};
export {
initLookup
};
答案 0 :(得分:4)
您只能在声明为await
的函数内使用async
。
ibanData.oninput
函数不是这样声明的。
答案 1 :(得分:1)
您可以将事件转换为Promise,但也应该侦听错误(如果存在),否则如果以某种方式失败则永远不会继续:
unsigned
上面的代码的问题是const inputAsPromise = (ibanData) =>
new Promise((resolve, reject) => {
ibanData.oninput = resolve;
//@todo: onerror should be reject
});
async function initLookup() {
const ibanData = document.getElementById('iban-details');
let country = '';
let bban;
if (ibanData !== null) {
await inputAsPromise(ibanData);
const iban = ibanData.value;
if (iban.length === 12) {
country = iban.substr(0, 2);
bban = iban.substr(4, 12);
try {
const bankdata = await requestBICandBankname(
country,
bban,
);
console.log('bankdata', bankdata);
} catch (err) {
console.log(err);
}
}
}
}
可能会多次触发,但是您只能解决一次Promise。如果是这种情况,那么只有在满足某些条件的情况下,您才能解决该问题:
oninput
那只是一个例子,您必须查看适用于您的情况的