すべてのクライアントが自分のWebサイトに追加する一般的なJavascriptコードスニペットがあります。このコードスニペットはJSライブラリをフェッチします。このライブラリには、ライブラリが時間内にフェッチされた場合に呼び出す必要のあるいくつかの重要な関数があります。ライブラリが時間内にフェッチされない場合は、これらの関数を呼び出さないでください。
これを実装するために、それを処理するコールバック関数(これらの重要な関数が呼び出されるかどうかに応じて変数を設定する)を持つタイムアウトを設定しました。これで、クライアントのWebサイトにタイマー値が非常に小さいタイムアウト/間隔がすでにある場合を除いて、ほとんどのシナリオで完全に機能します。問題を確認するには、フィドルhttp://jsfiddle.net/tmckM/37/を参照してください。
これを実現するための一般的な方法を見つける必要があります。そうすれば、ライブラリが時間内にフェッチされても、どのような場合でもタイムアウトは発生しません。
以下はJSFiddleで使用されるコードです
//Though the library file is downloaded in time(which can be seen from network tab) but still the timeout fires before the library execution. I need to find a workaround for this issue
var library_timeout = 1000;
//All time values are in milliseconds
function loadLibrary() {
var b = document.createElement('script');
b.src = 'http://yourjavascript.com/35211527623/library.js';
b.type = 'text/javascript';
document.getElementsByTagName('head')[0].appendChild(b);
}
function wasteTime() {
if (!wasteTime.counter) {
wasteTime.counter = 1;
}
else {
wasteTime.counter++;
}
if (wasteTime.counter == 5) {
clearInterval(wasteTimerId);
}
console.warn('Start wasting time');
var initial = Date.now();
while (true) {
if (Date.now() - initial > 1000) {
break;
}
}
console.warn('Stopped wasting time');
}
function startProcess() {
window.process_started_at = Date.now();
console.log('Started the process at timestamp:', process_started_at);
setTimeout(function () {
window.lib_timeout_fired_at = Date.now();
console.log('Library timed out at timestamp:', lib_timeout_fired_at);
console.log('So, though the library file will still download, but the functions in it won\'t be called.');
}, library_timeout);
loadLibrary();
}
//The following line is implemented on user's website.I can't change it.
wasteTimerId = setInterval(wasteTime, 0);//If this line is skipped then library is always executed first and then timeout occurs.
startProcess();