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);
}
}
});
}