2011-01-12 17 views
0

$.get経由でサーバーから取得した値を返す関数を作成するにはどうすればよいですか?AJAXリクエストから値を取得する関数

これは私が仕事しない、しようとしたものです:

function getMessage(key) { 
    $.get("/messages.json", function(data) { 
     return data.messages[key]; 
    }, "json"); 
} 

任意のアイデア?

+0

は、我々 'メッセージで返される(たぶん)JSON形式のデータを抜粋することができます。 json'? –

答えて

4

Ajaxリクエストはですので、非同期です。そのため、データが利用可能になると、を処理するために、$.getにコールバックを渡す必要があります。しかし、getMessage関数は、$.getコールバックが実行される前に戻ります。
戻り値で何かをしているコールバックを渡す必要があります。例:もちろん

function getMessage(key, cb) { 
    $.get("/messages.json", function(data) { 
    cb(data.messages[key]); 
    }, "json"); 
} 

getMessage('foo', function(data) { 
    alert(data); 
}); 

あなたも$.getに直接callackを渡し、そこにデータ抽出を扱うことができます。

function getMessage(cb) { 
    $.get("/messages.json", cb); 
} 
+0

+1しかし、最後の文は混乱しています。とにかく 'getMessage'がすぐに戻ります。 –

+0

@Daniel Earwicker:はい、それを修正しました;) –

0

これを処理するには、$.ajax経由で同期呼び出しを使用するか、値を返すのではなく関数にコールバックを渡す方法があります。後者は、コールの非同期性を保持するため、AJAXを扱う標準的な方法です。

非同期

function processMessage(key,elem,cb) { 
    $.get('/messages.json', function(data) { 
      if (cb && typeof(cb) === 'function') { 
       cb.apply(elem,data.messages[key]); 
      } 
    } 
} 


$('.something').each(function() { 
     processMessage('somekey', this, function(msg) { 
      $(this).append(msg); 
     }); 
}); 

同期 - それが行われるまで、あなたのブラウザをロックしますので、この方法でそれを行うしないようにしてください。

function getMessage(key) 
{ 
    var result = ''; 
    $.ajax({ 
     url: '/messages.json', 
     aSync: false, 
     type: 'get', 
     dataType: 'json', 
     success: function(data) { 
        result = data.messages[key]; 
       } 
    }); 
    return result; 
} 

$('.something').each(function() { 
    var msg = getMessage('somekey'); 
    $(this).append(msg); 
}); 

注:これらはテストされていません。

関連する問題