1

問題:

次のスクリプトがあります。基本的には、ajax 呼び出しからデータを取得し、データを関数に渡し、データの ID をグローバル変数に格納するため、jQuery から取得した別のスクリプトでグローバル変数を使用できます$.getScript()

スクリプト (script1.js):

このビットは ajax を介してデータのビットを取得するだけですが (表示されていません)、データは含まれており、データの長さに基づいて関数をwidget_data.d実行する必要があります。この場合は 3 回の反復です。getWidgetContent()widget_data.d

window.global_widget_id = "";

for ( j = 0; j <= widget_data.d.length - 1; j++ ) {

    getWidgetContent( widget_data.d[j] );

}

上記のループが実行する関数は次のとおりです。

function getWidgetContent( widget ) {

    if(widget.script!=null){

        window.global_widget_id = widget.widget_id;

        $.getScript( "js/script2.js", function() {

            alert( "direct title variable in script1.js: " + widget.title );
            alert( "global variable in script1.js: " + window.global_widget_id );
            alert( "direct variable in script1.js: " + widget.widget_id );

            $( ".widget_header_title_" + widget.widget_id ).append( widget.title );

        });


    }

}

スクリプト (script2.js):

これは、上記の関数がグローバル変数も渡すスクリプトであり、グローバルに保存された ID に基づいて ajax 経由でデータを取得する必要があります。

var my_widget_id = window.global_widget_id;

alert( "global variable in script2.js " + window.global_widget_id );
alert( "direct variable in script2.js: " + my_widget_id );

// then do some more ajax stuff with global_widget_id before repeating the loop again.

実績:

global variable in script2.js: 66
direct variable in script2.js: 66
direct title variable in script1.js: title for 57 goes here
global variable in script1.js 66
direct variable in script1.js 57

global variable in script2.js: 66
direct variable in script2.js: 66
direct title variable in script1.js: title for 65 goes here
global variable in script1.js 66
direct variable in script1.js 65

global variable in script2.js: 66
direct variable in script2.js: 66
direct title variable in script1.js: title for 66 goes here
global variable in script1.js 66
direct variable in script1.js: 66

予想された結果:

global variable in script2.js: 57
direct variable in script2.js: 57
direct title variable in script1.js: title for 57 goes here
global variable in script1.js 57
direct variable in script1.js 57

global variable in script2.js: 65
direct variable in script2.js: 65
direct title variable in script1.js: title for 65 goes here
global variable in script1.js 65
direct variable in script1.js 65

global variable in script2.js: 66
direct variable in script2.js: 66
direct title variable in script1.js: title for 66 goes here
global variable in script1.js 66
direct variable in script1.js: 66

私が試したこと:

このウェブサイト基づいて、generator function. テンプレートは次のとおりです。

(function(variable) {
  return function() {
    // do something with variable 
  }
})(value);

私はこれを使用してみましたが、何も起こらず、エラーもアラートも何も起こりません。

for ( j = 0; j <= widget_data.d.length - 1; j++ ) {

    var the_data = widget_data.d[j];

    (function(the_data ) {
      return function() {
        getWidgetContent( the_data  );
      }
    })(the_data);

}

質問:

ジェネレーター機能が動作しないのはなぜですか?

4

2 に答える 2

0

あなたがやっていることは、あなたのを呼び出す関数を返すことですgetWidgetContent.

(function(the_data ) {
  return function() { // you will return a function, it will not get called.
    getWidgetContent( the_data  );
  }
})(the_data); // the (the_data) means you call the first function with the_data as parameter.

を呼び出したい場合はgetWidgetContent、直接呼び出す必要があります。

(function(the_data ) {
  return getWidgetContent( the_data  );
})(the_data); 
// this will call your anonymous function with the_data as parameter, giving closure.

しかし、私が見る限り、これはあなたの唯一の懸念ではありません. script1.js 出力を出力する成功関数は、script2.js が実行された後、おそらく読み込みのループ後に呼び出されます。

編集: script2.js が読み込まれるまでに、グローバル変数を 57、65、66 で 3 回設定しましたが、上書きしたため、script2.js は最後の値 66 しか認識しません。ループは、非同期のスクリプト ダウンロード。

script2 のコードを関数に入れて、ウィジェットをパラメータとして script1 の成功コールバックから呼び出すとよいと思います。

function getWidgetContent( widget ) {

  if(widget.script!=null){

    window.global_widget_id = widget.widget_id;

    $.getScript( "js/script2.js", function(inner_widget) {
        return function() {
          // this is the function that will get called as the callback.
          alert( "direct title variable in script1.js: " + inner_widget.title );
          alert( "global variable in script1.js: " + window.global_widget_id );
          alert( "direct variable in script1.js: " + inner_widget.widget_id );
          // inner_widget is the parameter, so it is in a closure
          $( ".widget_header_title_" + inner_widget.widget_id ).append( inner_widget.title );
          //make your call to script2.js if you want.
          script2.run(inner_widget);
        }
    }(widget));
    //we call the generator function with the widget to get closure.
  }
}
于 2012-12-10T14:17:14.677 に答える
0

ただではありません:

for ( j = 0; j <= widget_data.d.length - 1; j++ ) {

  var the_data = widget_data.d[j];

  (function(the_data) {
    getWidgetContent( the_data );
  })(the_data);

}

?

そうでなければ、返された関数がどこで呼び出されるのかわかりません

于 2012-12-10T14:38:19.180 に答える