2011-12-04 12 views
2

私は、タスクが完了したかどうかをチェックするはずのjavascript関数を持っています。 タスクが完了すると、サーバー上のファイルに完了レコードが存在します。 関数は、ファイルに完了レコードを取得するまで(遅延して)いくらか遅延してサーバーへの再帰呼び出しを行うことになっていました。 以下のコードは、Webコンソールの例である の例です。 [20:06:21.202] [20:06:21.993] タスクは次のようになります。変数に競合しました待機時間値がmax_waittimeに等しくなっています。 テストケース全体の出力は期待どおりですが、何か問題があります。 どこが間違っていますか?タスクが完了したことを確認してください

function check_status(time,div_id,filename) { 

var status =0; 
var waittime=time; 

var max_waittime=11000000; 
if (waittime < max_waittime){waittime=waittime+1000000; } 

$.ajax({ 
    type: "GET", 
    async: false, 
    url: "code_on_server_checking_file.php", 
    data: "f="+filename, 
    dataType: "text", 
    success: function(content) { 

    if (content) { 
    // stuff related to output of the result 
     .... 
     return status=1; 
    } 
    else {return status=0;} 
     } 
    }); 

if (status == 0 && waittime < 20000000){ 
    setTimeout(check_status(waittime,div_id,filename),waittime); 
    } 
else {alert('check_status passed!'+status+'|'+waittime);} 
} 

答えて

0

:あなたはcheck_statusにパラメータを渡す必要があるので、匿名関数を使用します。無名関数で関数呼び出しをラップします。また、必要に応じて、同期呼び出しを使用するのではなく、単にajaxコールバックで呼び出しを設定する方がよいでしょう。同期呼び出しがブラウザを縛ります。

function check_status(time,div_id,filename) { 

    $.ajax({ 
     type: "GET", 
     url: "code_on_server_checking_file.php", 
     data: "f="+filename, 
     dataType: "text", 
     success: function(content) { 
     if (content) { 
     // stuff related to output of the result 
     } 
     else { 
      time += 1000000; 
      if (time < 20000000) { 
       setTimeout(function() { check_status(time, div_id, filename); }, time); 
      } 
     } 
     } 
    }); 

} 
+0

'async'呼び出しについての良い点です。私は逃しました。 –

1

あなたはcheck_status(...)を呼び出すことによって返された値、setTimeoutcheck_statusをしませ渡す必要があります。あなたが関数を呼び出す代わりにsetTimeoutメソッドへの参照として、それを与えている

setTimeout(function() { 
    check_status(waittime, div_id, filename); 
}, waittime); 
0

「サーバーへの再帰呼び出し」?いいえ、私はあなたがそれを望むとは思わない。

3つ進むと、var max_waittime = 11000000;作成され、3回初期化されます。

たぶん、あなたはAJAX呼び出し(アヤックス設定)すべての http://api.jquery.com/jQuery.ajax/

0

まずのタイムアウト値を設定することができますが、AJAX呼び出しが非同期呼び出しであることを理解していないように、それが見えます。それを呼び出すだけでネットワーキング操作が開始され、残りのコードは引き続き実行されます。ネットワーキング操作が完了してからしばらくすると、成功関数が呼び出されます。

ajax呼び出しの結果に対して操作できる唯一の場所は、成功関数です。成功関数の値を返すことはできず、どこにでも行くことができます。そこに行く唯一の場所は、それが落とされたAjaxコードのどこかにあります。 ajax呼び出しの結果で何かをする必要がある場合は、success関数でその操作を行うか、success関数から他の関数​​を呼び出して、返されたデータを渡す必要があります。

これらは動作しませんあなたのコードの一部である:

  1. 成功関数からステータス値を返すにはポイントがありません。戻り値がちょうど削除されるajax関数以外はどこにも行きません。
  2. このコード行if (status == 0 && waittime < 20000000){は、あなたが望むことをしていません。 ajax呼び出しは非同期であるため、このコード行が実行されるときには、statusの値はまだajax呼び出しによって設定されていません。したがって、常に0なので、あなたのロジックは決して動作しません。このロジックを成功ハンドラ内で移動する必要があります。
  3. 他の人からも言われたように、setTimeoutのパラメータは正しくありません。関数を実行した結果ではなく、setTimeoutに関数を渡す必要があります。

これは私が示唆しているコードです:

function check_status(time, div_id, filename) { 
    var max_waittime=11000000; 
    if (time < max_waittime){ 
     time=time+1000000; 
    } 

    $.ajax({ 
     type: "GET", 
     async: false, 
     url: "code_on_server_checking_file.php", 
     data: "f="+filename, 
     dataType: "text", 
     success: function(content) { 
      if (content) { 
       // stuff related to output of the result 
       if (time < 20000000){ 
        setTimeout(function() {check_status(time, div_id, filename)}, time); 
       } 
      } 
     } 
    }); 
} 

注Ajaxの結果のすべての処理が成功機能で行われ、我々は後のsetTimeoutその再呼び出しのCHECK_STATUSに無名関数を渡すこと時間遅延。 setTimeoutはcheck_statusが後でもう一度呼び出される前に戻ることができるので、これは実際には再帰ではありません(他のものと同様)。

関連する問題