2011-07-16 5 views
1

私はjQueryとcountdown(jQueryプラグイン)を使用しています。私はカウントダウンがx秒間実行されるようにしたい。ここでxはserverTime.phpの整数である。非同期AJAX呼び出しからresponseTextを別の関数に渡すにはどうすればよいですか?

問題 - getTime()関数のresponseTextをTimer関数で使用できるように返す方法がわかりません。

は、最初に私は(jQueryのなし)純粋なJSを使用してみました、と私は似てトピックを見つけました:

いくつかのアイデア/可能な解決策を見つけました:

  • 同期呼び出しと応答を格納するグローバル変数を使用します。私は これを試してみて、 ユーザ画面をフリーズする(ほとんどの場合、悪い練習とみなされる)ので、これはオプションではありません。
  • helper function
  • -

タイマ機能

$(function(){ 
    var time = getTime(); // time is an integer 
    $('#defaultCountdown').countdown({until: time, format: 'S', onExpiry: action}); 
}); 

getTime()チェックserverTime.php整数される、コンテンツを返すべきです。 アラート(html)は機能しますが、return htmlは機能しません。呼び出しが非同期であることがわかっています。

function getTime() 
{ 
    $.ajax({ 
    url: "serverTime.php", 
    cache: false, 
    async: true, 
    success: function(html) 
    { 
     alert(html); 
      helperFunction(html); 
     return html; 
    } 
    }); 
} 

helperFunction。残念ながら、私は結果をタイマー関数に渡す方法を知らない。

function helperFunction(response) 
{ 
    return response; 
} 

serverTime.php

echo 30; // 30 seconds, just an example 

私は私の問題を説明し、私はそれにいくつかの時間を入れていることを示すためにしようとしました。追加情報が必要な場合は、尋ねてください。たぶん私は間違った方向に考えているだけかもしれません。

答えて

4

time変数が実際に使用されている場所にコードが表示されません。

AJAXは非同期あるので最終的には、getTime()関数からAJAXの応答を返すことができないので、応答がを受信する前にgetTime()は常に返されます。

あなたはgetTime()関数に、好きなコード合格した方が良いんだろう...

function getTime(func) 
{ 
    $.ajax({ 
     url: "serverTime.php", 
     cache: false, 
     async: true, 
     success: func // <--set the function received as the callback 
    }); 
} 

    // pass a function to getTime, to be used as the callback 

function myFunc(html) { 
    /* do something with html */ 
} 
getTime(myFunc); 

...または応答...

function getTime(func) 
{ 
    $.ajax({ 
     url: "serverTime.php", 
     cache: false, 
     async: true, 
     success: function(html) { 
      someFunction(html); // <--- call a function, passing the response 
     } 
    }); 
} 

someFunction(html) { 
    /* do something with html */ 
} 

...あるいは単に:successコールバックに適切なコードをハード...

function getTime(func) 
{ 
    $.ajax({ 
     url: "serverTime.php", 
     cache: false, 
     async: true, 
     success: function(html) { 
      /* do something with html */ 
     } 
    }); 
} 

を渡し、:successコールバック内から別の関数を呼び出します編集:

ここでは、timeを使用する場所を確認します。上記の私の2番目の例を使用することができます。作成する関数がgetTime()関数にアクセス可能な可変スコープにあることを確認してください。このよう

$(function(){ 
    getTime(); // get things started when the DOM is ready 
}); 

function getTime() { 
    $.ajax({ 
     url: "serverTime.php", 
     cache: false, 
     async: true, 
     success: function(html) 
     { 
      doCountdown(html); // call doCountdown, passing it the response 
     } 
    }); 
} 

    // doCountdown receives the response, and uses it for the .countdown() 
function doCountdown(time) { 
    $('#defaultCountdown').countdown({until: time, format: 'S', onExpiry: action}); 
} 
+0

時間変数をタイマー機能で使用されています(読みやすくするために変数の名前を変更し、混乱の原因となった名前を変更するのを忘れていました)。基本的に、私はちょうどserverTime.phpからの値をタイマー機能に入れたいと思っています。あなたの提案はありません。私はこの質問をする前に同様のアプローチを試み、もう一度試しました。そして、コールが非同期で応答が返されないので、いつも私は立ち往生しています。 – afaf12

+0

@awerti:はい、返信は返されません。呼び出され、AJAXからの応答を受け取り、 '.countdown()'で使用できる名前付き関数を作成します。また、問題の一部は、 '$(function(){...})の中の何かがその外のもので利用できるということかもしれません。私は分で更新します。 – user113716

+0

...上記のコメントでは、「利用可能」*の代わりに*「それ以外のものには利用できません」*を意味しました。 – user113716

1

あなたが非同期的にあなたのAJAXを使用しているので、それは別のスレッドで実行されます。つまり、var time = getTime();は何も設定されていません。 return html;へのajax呼び出しが実行されるまでには、応答を受信するのに何も待機していません。元のスレッドの実行が終了し、関数getTime()は何も設定していないため、timeは空白になります。

あなたは可能性があり、グローバルVARとしてセットアップ時間、そしてgetTime()を呼び出すことは、時間ときAJAX呼び出しが終了設定 - この場所とするときに時間を使うために必要なすべての依存....

var time = 0; 

$(function(){ 
    getTime() 
    $('#defaultCountdown').countdown({until: austDay, format: 'S', onExpiry: action}); 
}); 

function getTime() 
{ 
    $.ajax({ 
     url: "serverTime.php", 
     cache: false, 
     async: true, 
     success: function(html) 
     { 
      time = html; 
     } 
    }); 
} 
+1

Hmmm ...本当に別のスレッドではありませんが、それは確かにノンブロッキングです。これがあなたの主なポイントです。 – user113716

関連する問題