2016-11-22 8 views
1

私はechoをjsonでエンコードしたphpファイルを持っています。私はこの単語を取得するjavascript関数を持っています。私はこの関数を呼び出して、返された単語がすでに配列に入っているかどうかをチェックし、そうであれば、別の単語を呼びたいと思います。私は基本的に私の配列にない単語を得るまで、このプロセスを繰り返す必要があります。私はこれに苦しんでいるので、これを行う方法についていくつかアドバイスが必要です。私はクライアント側だけでこれをやりたい現在、getWord()を呼び出すと、undefinedが返されますが、関数自体が機能するので、その時点で単語が取得されていないことが疑われます。PHPファイルにヒットする関数を繰り返し呼び出す

<?php 
$sql = "SELECT * FROM words ORDER BY RAND() LIMIT 1"; 

$result = $db->query($sql); 

$row = $result->fetch_assoc(); 
$word = $row['word']; 
echo json_encode($word); 
?> 


function getWord(){ 
     var word; 
     $(document).ready(function(){ 
      $.getJSON("getWord.php",function(data){ 
       word = data; 
       alert("1st alert: " + word); 
      }); 

     }); 
     return word; 
    } 

$(document).ready(function() { 
      $("#newRound").on("click",function(){ 
        currentWord = getWord(); 
        alert("SEcond alert: " + currentWord); 
        //check here if data is already in wordsSoFar arary and if it is, get another word from getword.php 
        document.getElementById("input1").style.visibility = 'visible'; 
        //currentWord = data; //set the current work 
        lives = 6; //reset lives 
        tracker = 0; 
        incorrectLettersGuessed = ""; 
        allGuessedLetters = ""; 
        updateLetters(); 
        document.getElementById('hangman').innerHTML = '<center><img src="stage1.png"></center>'; 
        createTable(currentWord); 
        output.innerHTML = '<center>'+messages.validLetter + '</center>'; 
        alert(currentWord); 

      }); 
    }); 
+0

「getWord.php」のソースはどこですか? Btw、 '$ .getJson()'は[非同期](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Synchronous_and_Asynchronous_Requests)メソッドです。したがって、 'getWord()'関数は常に空の値を返します。 –

+0

その単語のデータベース。 getWord()が競合した後にメソッドを呼び出した後にコードを実行する方法はありますか? –

+0

それは単語を警告しますか?そうであれば、私の最初のコメントに掲載されている_asynchronous_ iのリンクを確認してください。 –

答えて

3

問題は、残りのプログラムの実行が終了した後で、PHPサーバーへのajax呼び出しが解決されることです。この時点でgetWord()関数は次のように機能します。

  1. 変数を作成しますword。この時点でwordundefinedになります。
  2. PHPサーバを非同期に呼び出すように開始しました。
  3. 返信wordこの時点ではまだundefinedに相当します。
  4. wordを返すと、非同期呼び出しが解決され、コールバック関数が実行されます。

getWord()から単語を返す代わりに、この非同期呼び出しが作成してメイン関数の結果を処理するという約束を返す必要があります。このようにこの問題に加えて

function getWord(){ 
    return $.getJSON("getWord.php"); 
} 


$(document).ready(function() { 
     $("#newRound").on("click",function(){ 
       getWord().done(function(currentWord) { 
        alert("The current word is " + currentWord); 
        //check here if data is already in wordsSoFar arary and if it is, get another word from getword.php 
        document.getElementById("input1").style.visibility = 'visible'; 
        //currentWord = data; //set the current work 
        lives = 6; //reset lives 
        tracker = 0; 
        incorrectLettersGuessed = ""; 
        allGuessedLetters = ""; 
        updateLetters(); 
        document.getElementById('hangman').innerHTML = '<center><img src="stage1.png"></center>'; 
        createTable(currentWord); 
        output.innerHTML = '<center>'+messages.validLetter + '</center>'; 
        alert(currentWord); 
       }); 


     }); 
}); 

getWord機能で$(document).readyを使用する必要があります。この関数は、ドキュメントが読み込まれたときにだけ呼び出されます。

+0

なので、whileループでgetWord()。done {...}からすべてを入れると、条件が満たされるまで単語を取得できるはずですか? –

+0

whileループで非同期呼び出しを実行すると、次の繰り返しを続ける前に非同期呼び出しの結果を待つことができないため、機能しません。あなたがしたいことを達成する最も簡単な方法は 'wordsSoFar'配列をPHPファイルに送り、サーバが配列に含まれていない単語を返すことができるようにすることです。この方法では、JavaScriptで非同期呼び出しを1つだけ行うだけです。 – yadejo

+0

PHPを修正したくない場合は、AlexandrXのソリューションをご利用ください。 – yadejo

0

私は推測する、問題はあなたのgetWord機能にreturn前に、サーバが答え実行しword割り当てが起こったということです。 $.ajaxasync:falseパラメータを使用してください。

関連する問題