2017-04-01 14 views
0

この質問にはすでに回答していて、私はそれらのいくつかを使っていますが、私は何が間違っているのかまだ分かりません。ajaxの結果を返すにはどうすればいいですか?

基本的に私は、AJAXの成功の結果を返す機能があります:関数を呼び出す

var Functioncalling = function(id){ 
var Infotoreturn=null; 
formdata = { 
    'id': id 
}; 

$.ajax({ 
    type: 'POST', 
    url: 'http://localhost:20012/pr/servlet', 
    data: formdata, 
    contentType: "text/html", 
    success: function(result){ 
     console.log("1="+result); 
     Infotoreturn = result; 
    } 
}); 
console.log("2="+Infotoreturn); 
return Infotoreturn; 
} 

を:

var idreturned = Functioncalling(idvalue); 
console.log("3="+idreturned); 

は今、私の最初のコンソール出力に私は、私とまったくデータを取得していますそう思う。しかし、2番目と3番目の両方の出力はnullです。

+0

あなたは、非同期リクエストの結果を返すことができません。非同期要求は残りのコードの(同期的な)フローから発生するため、結果を返そうとするまでに要求はまだ解決されていません。約束やjQueryの遅延オブジェクトについて学ぶ必要があります。 – Utkanos

+0

@Utkanosが言っていることに加えて、最後のreturn文は時期尚早です。変数 'Infotoreturn'は、Ajax呼び出しが非同期に、つまり並行して実行されるため、nullになります。主な機能は、操作が完了する前に戻ります。コンソールは結果をログに記録しますが、変数には遅すぎます。 – Manngo

+0

@Manngo変数の早い方を意味します、そうですか? – jaksdfjl

答えて

0

@Utkanosが言っていることに加えて、最後のreturn文は時期尚早です。

変数Infotoreturnは、Ajax呼び出しが非同期的に、つまり並行して実行されるため、nullになります。主な機能は、操作が完了する前に戻ります。コンソールは結果をログに記録しますが、変数には遅すぎます。

効果的に、Ajaxコールはバックグラウンドで遅れます。したがって、return文は元の値を保持します。

プロミス&遅延オブジェクトなどの高度な機能を使用することも、次のステップをコールバックとして書き込むこともできます。ここで

は、コールバックを使用した例である:

var Functioncalling = function(id,callback) { 
    var Infotoreturn=null; 
    formdata = { 
     'id': id 
    }; 

    $.ajax({ 
     // existing code 
     success: function(result){ 
      console.log("1="+result); 
      // Modification 
      callback(result); 
     } 
    }); 
    // nothing to report yet 
} 
function where_I_need_the_result(result) { 
    console.log('I got: '+result); 
} 

Functioncalling(id,where_I_need_the_result); 
+0

私の遅い返信をお詫び申し上げます。とにかく、私は 'return2'を' step2() 'に追加しました。そして、私はこれをしました:' function_I_need_the_result(){var details = FunctionCalling(id、step2); \t console.log(details);} '詳細は未定義ですが、なぜですか? – jaksdfjl

+0

結果を待たせない限り、 'Functioncalling'から結果を得ることはありません。つまり、Ajaxコールを同期させることです。これは、正当な理由からメインスレッドで廃止予定です。上記の例では、 'step2'を' where_I_need_the_result'に変更してどのように使用するのかを示しています。 – Manngo

+0

@jaksdfjl:答えを慎重に読んでください。あなたは、結果を返すのではなく、結果を処理したいコードを渡すという、非常に重要な点**を見逃しています。 'detail = Functioncalling(id)'を実行することはできません。**関数呼び出し(id、function(details){/ *詳細はこのスコープで利用可能です* /}) – slebetman

関連する問題