1

この種の質問が何度も出されていることは知っています (私は Stackoverflow などで多くのことを読んだり、読み直したりしました)。クロージャー、無名関数などを試してみましたが、グルコードではないため、何も得られませんでした ):.

ここに私の問題があると言った:

function A (a) {
  for (var i in a) {
    var x = a[i];
    function B (x); // wait for the end of the function B before next loop
  }
}

....

function B (x) {

 //do things with "x" and repeat the function B until a condition is true and  then return to the function A
}

私は多くのことを試しました(おそらく十分ではありません)が、適切に機能するものはありません...

ですから、あなたの提案を事前にありがとう

よろしく

編集 :

ここに完全なコードがあります:

  var Test  = {

  ......

  setProgress: function(count) {
   var win = Test.getMainWindow();
   var progressMeter = win.document.getElementById("progressMeter");
   progressMeter.value =  count;
  }, 

  cancelCheck: function(event) {
    var win = Test.getMainWindow();
    win.document.getElementById("cancel").value = "cancel";
  },


  timeout: function (item) {

      var win = Test.getMainWindow();
      win.document.getElementById("progressMeterText").value = item;
      var stat = Test.getStatus()

       if (stat !== "loading" || win.document.getElementById("cancel").value == "cancel") {

      // if cancel button is clicked         
      if (win.document.getElementById("cancel").value == "cancel") {

        Test.setProgress(100);
        Test.stop();
        win.document.getElementById("cancel").value = "";
        win.document.getElementById("progressMeter").collapsed=true;
        win.document.getElementById("cancel").hidden=true;
        win.document.getElementById("progressMeterText").hidden=true;

      }
      // end of the loading
      else if (stat !== "loading") {
        Test.setProgress(100);
        win.document.getElementById("progressMeter").collapsed=true;
        win.document.getElementById("cancel").hidden=true;
        win.document.getElementById("progressMeterText").hidden=true;
        win.document.getElementById("cancel").value = "";
      }

      // loading is running
      else {        
        count = count+5;
        if (count == 100) {
          count = 0;
        }
        Test.setProgress(count);
        setTimeout (Test.timeout, 100 , item);
       }
     } 
   },

   getStuff: function (items) {
    for(var i in items) {
      var item = items[i];

        if (!item.host || (items && item.id != items)) continue;

        var listener = new Test.GetListener(item);
        listener.instance = new TestGet(item, listener).execute();

        count = 10;
        Test.setProgress(count);
        var buttoncancel = win.document.getElementById("cancel");
        buttoncancel.addEventListener ('click', Test.cancelCheck, false);

        Test.timeout(item);

        .....

    }
        .....
  }

}
4

2 に答える 2

2

これBは再帰関数のようですが、それでも。だけで呼び出す必要がありますB();

function A(a) {
  for (var i in a) {
    B(a[i]); 
  }
}

function B(x) {
   var ret = dosomething(x);
   if (condition(ret)) {
     return;
   }
   return B(ret);
}
于 2012-09-12T13:37:35.067 に答える
0

私もコードの第一人者ではありませんが、役立つことが1つあります。

var xが1つあるため、var xが継続的に置き換えられます(配列を使用していると仮定します)。xの値として、配列の最後の項目である1つの値のみがあります。したがって、関数Bは、関数Aの配列の最後の項目の値で1回実行されます。それが探しているものでない場合は、配列の項目ごとに一意の変数を作成するか、単にfunction B (a[i]); if/elseまたはswitch/caseステートメントを使用して、必要な場合にのみ必要な情報を返します。

私はまだjsを把握しているので、それが少なくとも少し役に立ったことを願っています。幸運を!

于 2012-09-12T13:37:37.367 に答える