Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
if语句中的Javascript等待保留关键字错误_Javascript_Asynchronous_Async Await - Fatal编程技术网

if语句中的Javascript等待保留关键字错误

if语句中的Javascript等待保留关键字错误,javascript,asynchronous,async-await,Javascript,Asynchronous,Async Await,我正在编写一个小的JS脚本,其中一个用户输入他的IBAN,在输入前12个字符后,我从另一个URL请求银行名称和BIC。由于我必须等待该请求完成,因此我将函数设置为异步,并在请求中添加了一个“wait”。但是,我的脚本不再编译,出现以下错误:“解析错误:await是一个保留字”,指向我新添加的“await”。由于这个“等待”在几个if条件中,我想这可能就是问题所在。但是,它需要在这些if条件内。那么,有没有人知道我做错了什么,以及如何在if条件下获得等待 这是我的代码: function requ

我正在编写一个小的JS脚本,其中一个用户输入他的IBAN,在输入前12个字符后,我从另一个URL请求银行名称和BIC。由于我必须等待该请求完成,因此我将函数设置为异步,并在请求中添加了一个“wait”。但是,我的脚本不再编译,出现以下错误:“解析错误:await是一个保留字”,指向我新添加的“await”。由于这个“等待”在几个if条件中,我想这可能就是问题所在。但是,它需要在这些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
};
只能在声明为async的函数中等待

iBanda.oninput函数不是这样声明的。

您只能在声明为异步的函数中等待


iBanda.oninput函数不是这样声明的。

您可以将事件转换为承诺,但如果存在错误,也应侦听错误,否则如果以某种方式失败,它将永远不会继续:

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);
      }
    }
  }
}
上面代码的问题是oninput可能会触发多次,但您只能解决一次承诺。如果是这种情况,则只有在满足某些条件时才能解决:

const inputAsPromise = (ibanData) =>
  new Promise((resolve, reject) => {
    ibanData.oninput = (e)=>ibanData.value.length === 12?resolve():'';
    //@todo: onerror should be reject
  });

这只是一个例子,您必须了解在您的情况下,什么是有效的。

您可以将事件转换为承诺,但如果存在错误,也应该侦听错误,否则如果以某种方式失败,它将永远不会继续:

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);
      }
    }
  }
}
上面代码的问题是oninput可能会触发多次,但您只能解决一次承诺。如果是这种情况,则只有在满足某些条件时才能解决:

const inputAsPromise = (ibanData) =>
  new Promise((resolve, reject) => {
    ibanData.oninput = (e)=>ibanData.value.length === 12?resolve():'';
    //@todo: onerror should be reject
  });

这只是一个例子,你必须看看在你的情况下什么是有效的。

哦,我明白了!我只是一直在看父函数!谢谢你,我明白了!我只是一直在看父函数!谢谢