Я знаю, что мой ответ немного запоздал для этого вопроса, но вот замечательная статья на www.html5rocks.com - Глубокое погружение в мутные воды загрузки скрипта .
В этой статье делается вывод о том, что в отношении поддержки браузера лучший способ динамически загружать файл JavaScript без блокировки рендеринга содержимого выглядит следующим образом:
Учитывая, что у вас есть четыре сценария с именем script1.js, script2.js, script3.js, script4.js
, тогда вы можете сделать это с помощью async = false:
[
'script1.js',
'script2.js',
'script3.js',
'script4.js'
].forEach(function(src) {
var script = document.createElement('script');
script.src = src;
script.async = false;
document.head.appendChild(script);
});
Теперь Spec говорит: загрузите вместе, выполните в порядке, как только все будет загружено.
Firefox & lt; 3.6, Opera говорит: я понятия не имею, что это за «асинхронная» вещь, но так бывает, я выполняю скрипты, добавленные через JS, в том порядке, в котором они добавлены.
Safari 5.0 говорит: «Я понимаю», async ", но не понимают, что он устанавливает значение" false "с помощью JS. Я буду выполнять ваши скрипты, как только они приземлятся, в любом порядке.
IE & lt; 10 говорит: «Не знаю, как« асинхронно », но есть обходной путь с использованием« onreadystatechange ».
Все остальное говорит:« Я твой друг, мы сделаем это по книге ».
Теперь полный код с IE & lt; 10:
var scripts = [
'script1.js',
'script2.js',
'script3.js',
'script4.js'
];
var src;
var script;
var pendingScripts = [];
var firstScript = document.scripts[0];
// Watch scripts load in IE
function stateChange() {
// Execute as many scripts in order as we can
var pendingScript;
while (pendingScripts[0] && pendingScripts[0].readyState == 'loaded') {
pendingScript = pendingScripts.shift();
// avoid future loading events from this script (eg, if src changes)
pendingScript.onreadystatechange = null;
// can't just appendChild, old IE bug if element isn't closed
firstScript.parentNode.insertBefore(pendingScript, firstScript);
}
}
// loop through our script urls
while (src = scripts.shift()) {
if ('async' in firstScript) { // modern browsers
script = document.createElement('script');
script.async = false;
script.src = src;
document.head.appendChild(script);
}
else if (firstScript.readyState) { // IE<10
// create a script and add it to our todo pile
script = document.createElement('script');
pendingScripts.push(script);
// listen for state changes
script.onreadystatechange = stateChange;
// must set src AFTER adding onreadystatechange listener
// else we’ll miss the loaded event for cached scripts
script.src = src;
}
else { // fall back to defer
document.write('
Вот как это использовать:
while(dataRecords.Read()){
return dataRecords["columnName"].GetDateTime("MaxLogDate");
}
while
, и вы делаете их более смущенными, говоря, что цикл должен быть выполнен. Цикл (while
) не должен выполняться, необходимоRead()
. Вы можете вызватьRead
один раз без цикла. Вы в конечном итоге вызываетеRead()
один раз, потому что выreturn
из цикла, но если намерение называет его один раз, то, вероятно, более читаемо, чтобы избежать цикла. – GSerg 13 July 2018 в 16:04if (dataRecords.Read()) { return dataRecords["columnName"].GetDateTime("MaxLogDate"); }
более понятен, чемwhile(dataRecords.Read()) { return dataRecords["columnName"].GetDateTime("MaxLogDate"); }
. – GSerg 13 July 2018 в 16:11