Я пытаюсь дождаться загрузки API, однако мой тестовый код ниже, похоже, не учитывает задержку тайм-аута, поскольку он слишком быстро перебирается.
var google = false;
function test(check = false) {
if (!check) {
console.log('append the api');
check = true;
}
if (check) {
console.log('check api is loaded');
if(!google){
console.log('not loaded');
setTimeout(test(true), 10000);
return;
} else {
console.log('loaded');
}
}
}
Этот код должен просто отображать 2 console.log, пока переменная google не будет изменена на true.
Я не могу изменить это, так как браузер зависает из-за большого количества циклов.
Поскольку Jonas w сказал, что вы должны использовать setTimeout(test,1000,true)
вместо setTimeout(test(true),1000)
, см. Объяснение ниже:
Согласно MDN WindowOrWorkerGlobalScope.setTimeout() вы должны передать три переменные в setTimeout
: function
, timeout value
и parameters
которые будут переданы вызываемой функции. Функции в JavaScript являются объектами первого класса, поэтому вы передаете их как обычный объект. В вашем примере вы фактически не передаете функцию, но сразу вызываете ее и передаете значение setTimeout
которое возвращается из этой функции.
Вы ошибаетесь в этой строке:
setTimeout(test(true), 10000);
Вы должны передать функцию и не называть ее. Если вы хотите передать параметры, сделайте это так:
setTimeout(function(){test(true)}, 10000);
Вы рекурсивно вызываете test
функцию немедленно, потому что вы на самом деле устанавливаете тайм-аут для значения, возвращаемого test
, которое не определено.
Вы хотите поместить test(true)
в анонимную функцию, например:
var google = false;
function test(check = false) {
if (!check) {
console.log('append the api');
check = true;
}
if (check) {
console.log('check api is loaded');
if(!google){
console.log('not loaded');
setTimeout(() => test(true), 10000);
return;
} else {
console.log('loaded');
}
}
}
Обратите внимание на стрелку () =>
- это создает анонимную функцию, которая вызывается, когда истекает время ожидания. Если вам не нравится использовать эту новую функцию функции со стрелкой, вы также можете написать:
var google = false;
function test(check = false) {
if (!check) {
console.log('append the api');
check = true;
}
if (check) {
console.log('check api is loaded');
if(!google){
console.log('not loaded');
setTimeout(function () {
test(true);
}, 10000);
return;
} else {
console.log('loaded');
}
}
}