0

すべてのクライアントが自分の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();
4

1 に答える 1

0

ここでは問題は発生しません。libの読み込み時間は変化する可能性があり、wasteTimejsの読み込みは変化する可能性があり、タイムアウトも変化する可能性があります。ブラウザは、ロードされたスクリプトを最初に実行するか、両方がスケジュールされている場合はタイムアウトを発生させることができます。

これに対する解決策は、タイムアウトをまったく使用しないことです。変更するだけです

if(window.lib_timeout_fired_at)

ライブラリスクリプトで(すでに利用可能なすべての変数があります):

if (lib_started_at - process_started_at > library_timeout)

もちろん、名前を変更したりプレフィックスを付けたりすることもできるので、全体的なソリューションは次のようになります。

window.lib_timeout_firing_at = Date.now() + 1000;
…
if (Date.now() > lib_timeout_firing_at)
于 2013-02-25T13:56:36.987 に答える