2012-03-11 26 views
0

私はJavaScriptのスクリプトで厄介な問題があります。JavaScriptの戻り値は機能しませんか?返される定義されていません

これは私のコードです:私は別の関数でこの機能を要求するとき

function checkDiscountCode() 
{ 

    var discountCode = $('#korcode').val(); 
    var errorMessage = $('#errorMessage').text(); 

    if(discountCode.length > 2) 
    { 

    $.getJSON('calc.php?code=' + discountCode, function(json) 
    {  
     var color = json.color; 
     var soort = json.soort; 
     var waarde = json.waarde; 
     var message = json.message; 

     if(errorMessage != message) 
     { 
      $('#error').html('<font color="' + color + '" id="errorMessage">' + message + '</font>'); 
     } 

     if(message == 'OK!') 
     { 
      var outputData = soort + '-' + waarde; 
      console.log('outputData = ' + outputData); 
      return outputData; 
     } 

    }); 
    } 
} 

コンソールログは、単に警告(checkDiscountCode())たとえば、たとえば0から12.00のために、正しいデータが得られたが、それは定義されていません..

誰でも助けてくれますか?問題は表示されません。

ありがとうございます!

+0

警告しているときは、「discountCode.length> 2」はtrueですか?それはおそらく問題です。 – Purag

+0

@プルモウと私は同じことを考えています。あなたの観測の違いは、ページがロードされたときに関数が呼び出されているときです。 – vol7ron

+0

[AJAX呼び出しからの応答を戻す方法]の複製が可能ですか?(http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call) – icktoofay

答えて

1

discountCode.length > 2が真でない場合、値を返さないため、未定義が返されます。


場合、私はまた、あなたが別の関数alert(checkDiscountCode())に入れなかったし、あなたが放火犯をクローズアップ、またはコンソールが開いていない別のブラウザで開く場合は、お使いのブラウザはJavaScriptのエラーが発生することを追加しますあなたのコードにまだconsole.log(...)行が残っています。

ログオンするには、コンソールウィンドウが開いている必要があります。

+1

また、それを返す> 2 :) – user926734

7

checkDiscountCode()関数にはreturnというステートメントがありません。したがって、デフォルトでundefinedが返されます。

あなたが含まれてきたreturn文が$.getJSON()のためのコールバックとして渡された匿名関数の中で、それが戻っに戻ってそれを呼ばれるjQueryのコードに機能ではなく、あなたのコード(ことから復帰してそれでもmessage'OK!'でない場合は未定義を返します)。 (あなたのcheckDiscountCode()関数が値にいずれかの方法を返すようにしようとしませんが、またあなたの$.getJSON()は、discountCode.length > 2ない限り実行されません。)あなたは非同期に動作し、関数に渡されたコールバックから戻っている

1

。あなたはコールバックを取るためにコードを適応させ、それが非同期であるという事実に対処するために呼び出し側を変更しなければならないでしょう。

// won't work 
function checkSomething() { 
    someAsynchronousFunction(function(result) { 
     return result == "success"; 
    }); 
} 
if(checkSomething()) { 
    alert("It worked."); 
}else{ 
    alert("It didn't work."); 
} 

あなたはこのように見えるようにコードを変更する必要があります:

function checkSomething(callback) { 
    someAsynchronousFunction(function(result) { 
     callback(result == "success"); 
    }); 
} 
checkSomething(function(result) { 
    if(result) { 
     alert("It worked."); 
    }else{ 
     alert("It didn't work."); 
    } 
}); 
+0

私は結果を伴わずに試しましたが、私はfuntionを持っています: [code] checkDiscountCode(function(outputData){ alert(outputData); }); [/コード] このデータを取得すると、私は [コード] 関数checkDiscountCode(コールバック) { \tコールバック(出力データ)とデータを設定します。 [/ code] (ofcコードのみ) 何が間違っていますか? – user926734

+0

それは完全に動作し、そのスキーマは非常に便利です。 JSの同期関数と非同期関数に関するドキュメントを読むためのリンクはありますか? –

+0

@Joe:JavaScriptは、他の多くの言語とは異なり、実際には公式のドキュメントを持っていません。しかし、スタックオーバーフローに関するもう1つの質問は、[これは非常に良い説明](http://stackoverflow.com/q/14220321)のものと事実上同じですが、その理由を説明する理由を説明してください。 (私がここで本当に詳しく述べなかったこと)とそれを修正する方法。 – icktoofay

0

jQueryのgetJSON()メソッドは非同期に実行されます。むしろこれよりことを意味

checkDiscountCode()にコールバック関数を追加する必要があります。コールバック関数は残りのアプリのロジックを実行します。たとえば、次のように

function sampleCallback(outputData) { 
    console.log('outputData = ' + outputData); 
} 

function checkDiscountCode(callback) { 
    $.getJSON('calc.php?code=' + discountCode, function(json) { 
    // get output data, and then call callback. 
    callback(outputData); 
    }); 
} 

checkDiscountCode(sampleCallback); 
+0

私も何かを返すべきですか?私はこの方法を試みたが、うまくいかなかった。 – user926734

+0

コードスニペットを修正して、コールバックの外観を示しました。 – monsur

0

そしてdiscountCode.length > 2場合は$.getJSON機能を呼び出しているが、それはコールバックを取り、すぐに何も返しません。したがってどちらの場合でもundefinedが得られます。

関連する問題