Java语句在if语句中等待保留关键字错误

时间:2018-12-13 14:18:45

标签: javascript asynchronous async-await

我正在编写一个小的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
};

JSFiddle

2 个答案:

答案 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

那只是一个例子,您必须查看适用于您的情况的