1

プログラムでローカル javascript ファイルをロードしようとしています - papaparse ライブラリ、その関数の 1 つを使用します。

$.getScript("./Content/Scripts/papaparse.js", function () {
    console.log("Papaparse loaded successfully");
    Papa.parse(file, { skipEmptyLines: true, header: false, complete: completeCallback });
});

スクリプトは正常にロードされましたが、parseメソッドを呼び出すとエラーがスローされます。

ReferenceError: パパが定義されていません

papaparseライブラリ内で、Papa次のように定義しました。

(function (global) {
    "use strict";

    var Papa = {};
    Papa.parse = someFunction;
    .
    .
    global.Papa = Papa;
}

それが役立つ場合、このコード全体が typescript ファイルから呼び出されます。
私は何を間違っていますか?

4

2 に答える 2

2

Castro が彼の回答で指摘したように、Jqueryの公式ドキュメントによると、getScript

スクリプトが読み込まれると getScript メソッドのコールバックが起動されますが、必ずしも実行されるとは限りません。

つまり、getScriptのコールバック関数が呼び出されると、ターゲット スクリプトは現在のページ コンテキストにのみロードされ、完全には実行されないため、そのスクリプトを実行するために JavaScript エンジンに時間を与える必要があります。どうやってその時間を与えることができますか。うーん、オプションの 1 つですsetTimeout/setInterval

setTimeout/setIntervalgetScript のコールバック関数内で使用できます。

コードの修正版は次のようになります:-

$.getScript("./Content/Scripts/papaparse.js", function () {
    console.log("Papaparse loaded successfully");
    function dealWithPapa() {
       Papa.parse(file, { skipEmptyLines: true, header: false, complete: completeCallback });
    }
    //regularly check after 100ms whether Papa is loaded or not
    var interval = setInterval(function() {
        if(Papa !== undefined) {
            //once we have reference to Papa clear this interval
            clearInterval(interval);
            dealWithPapa();
        }       
    },100);

});

それがあなたの疑問を解決することを願っています。

于 2016-07-04T17:07:44.860 に答える
0

https://api.jquery.com/jquery.getscript/によると:

コールバックは、スクリプトが読み込まれると発生しますが、必ずしも実行されるとは限りません。

setTimeout(300, function(){...})実行を待つためにa を使用する必要がある場合があります。

于 2016-07-04T15:33:45.607 に答える