Javascript 将检查页面上元素的异步/等待函数更改为与Safari 10一起使用

Javascript 将检查页面上元素的异步/等待函数更改为与Safari 10一起使用,javascript,async-await,es6-promise,Javascript,Async Await,Es6 Promise,我有以下函数,它检查选择器指定的元素是否在页面上 此代码在页面加载时运行,在加载元素之前。因此,它将继续尝试查找元素,直到达到最大timeout,然后返回false function rafAsync() { return new Promise(resolve => { requestAnimationFrame(resolve); }); } export default async function checkElement(timeout = 20) { le

我有以下函数,它检查
选择器指定的元素是否在页面上

此代码在页面加载时运行,在加载元素之前。因此,它将继续尝试查找元素,直到达到最大
timeout
,然后
返回false

function rafAsync() {
  return new Promise(resolve => {
    requestAnimationFrame(resolve);
  });
}

export default async function checkElement(timeout = 20) {
  let counter = 0;
  while (document.querySelector(selector) === null) {
    counter = counter + 1;
    if (counter > timeout) return false;
    await rafAsync();
  }
  return document.querySelector(selector);
}
问题是我需要支持Safari 10和其他一些不能与
async/await
一起工作的浏览器

如果不需要
wait
但仍然返回元素(如果找到),我如何使此工作正常

调用
checkElement
函数如下:

lookForElement(){


}

一种选择是通过类似或的transpiler从ES2017传输到ES2015或ES5

如果您想手动执行此操作,可以从中看到,
async
函数是承诺创建和使用的语法糖。
async
函数返回一个承诺。它从一位同步代码开始,然后返回程序流中遇到的第一个
wait
return
时的承诺

该函数非常简单,因此很容易重写:

export default function checkElement(timeout = 20) {
  // Create and return our promise
  return new Promise((resolve, reject) => {
    // Initialize counter and do first check
    let counter = 0;
    check();

    function check() {
      // Got the element?
      let element = document.querySelector(selector);
      if (element != null) {
        // Yes, resolve the promise
        resolve(element);
      } else {
        // No, timeout?
        counter = counter + 1; // ++counter; or counter++; would be more idiomatic
        if (counter > timeout) {
          // Yes
          resolve(false); // rejecting here would be more idiomatic, but that's not what your `async` function did
        } else {
          // No, check again on next RAF
          rafAsync().then(check);
        }
    }
  });
}

一种选择是通过类似或的transpiler从ES2017传输到ES2015或ES5

如果您想手动执行此操作,可以从中看到,
async
函数是承诺创建和使用的语法糖。
async
函数返回一个承诺。它从一位同步代码开始,然后返回程序流中遇到的第一个
wait
return
时的承诺

该函数非常简单,因此很容易重写:

export default function checkElement(timeout = 20) {
  // Create and return our promise
  return new Promise((resolve, reject) => {
    // Initialize counter and do first check
    let counter = 0;
    check();

    function check() {
      // Got the element?
      let element = document.querySelector(selector);
      if (element != null) {
        // Yes, resolve the promise
        resolve(element);
      } else {
        // No, timeout?
        counter = counter + 1; // ++counter; or counter++; would be more idiomatic
        if (counter > timeout) {
          // Yes
          resolve(false); // rejecting here would be more idiomatic, but that's not what your `async` function did
        } else {
          // No, check again on next RAF
          rafAsync().then(check);
        }
    }
  });
}