2016-06-17 3 views
0

ここで少し問題があります。私は自分の問題に関連しているように思われるさまざまな答えをチェックしましたが、これはうまくいかないようです。次のクエリとは異なり、最初にajaxクエリは未定義を返します

私はそうのようなリンクでページを持っている

<a href="#" onclick="showData(id)">View</a> 

そして、ここではjavascriptを

var queryResult; 
function getData(id, callbackfn){ 
    $.ajax({ 
     type:"POST", 
     url:"http://url/to/query", 
     data:{id: id }, 
     success: function(data){ 
     callbackfn(data); 
     }, 
     error: function(){ 
      return "err"; 
     } 
    }); 
} 

function showData(id){ 
    getData(id, Callback); 
    if(queryResult) 
    { 
     alert("Yahoooooo !"); 
    } 
    else 
    { 
     alert("Nope !!!"); 
    } 
} 

function Callback(data){ 
    queryResult = data.length; 
} 

初めてクリックすると、「リンクがアラートボックスが起動し、私が手いいえ!!! "それ以降のクリックでは「Yahoooooo!」と表示されます。 ページをリロードしたら、もう一度 "Nope !!!"最初は初めてでしたし、その後は大丈夫です。したがって、queryResultは最初の呼び出しでは定義されていませんが、最初の呼び出しでは定義されていないようです。何か案が ?あなたはアヤックス このメソッドは、デフォルトでasyncronousあるを使用している

function Callback(data){ 
    queryResult = data.length; 
    if(queryResult) 
    { 
     alert("Yahoooooo !"); 
    } 
    else 
    { 
     alert("Nope !!!"); 
    } 
} 
+0

アクセスした時点では更新されていません。コールバックで操作します。 – Rayon

+0

関数のためgetDataが非同期なので、ajax呼び出しが返される前に、評価される。したがって、この動作。 – Manish

答えて

0

Callback機能であなたのコントロールを置きます。

"getData"を呼び出すと、データがロードされます。それがロードされている間QueryResultではが

その後、データがロードされているが存在し、あなたのグローバルフラグが設定されている場合 あなたはチェックし

+0

あなたのお返事ありがとうございます。私はコントロールステートメントをコールバックに移動し、うまくいきました。あまりにも洗練されたアヤックスではなく、私は学んでいます。 –

+0

歓迎ですが、これが起こっている理由を他の回答で確認できます –

0

ありがとう

0

アヤックス(前回の要求が成功した場合、あなたがチェックしている瞬間)呼び出しはを非同期的に実行します。したがって、getData()を呼び出すと、メソッド呼び出しが瞬時に戻ります(そして、ajax呼び出しは別のスレッドで実行されています)。つまり、最初にリンクをクリックすると、ブロックifを打つ前にajaxコールに完了する時間がなかったので、queryresultに何も入りませんが、その次の時間(おそらく)は、次回リンクをクリックする前に終了しています。

ajax呼び出しから返されるデータに応じてブロックifなどのロジックがある場合は、コールバック関数に組み込む(または呼び出す)必要があります。コールバック関数へのgetDataから

if(queryResult) 
{ 
    alert("Yahoooooo !"); 
} 
else 
{ 
    alert("Nope !!!"); 
} 

だからこのケースでは、あなたはブロックを移動する必要があります。

関連する問題