0

.ajax関数自体以外の場所でデータ変数(ajax呼び出しによって返される情報)を使用できないという、かなり奇妙な問題です。

これは範囲の問題であると確信していますが、それは私を超えており、あらゆる指針に感謝するでしょう。

$('img#test').live('click', function(e) {
    e.preventDefault();
    var test = getPreviewImage();
    alert(test); // This just gives undefined
});


function getPreviewImage()
{
  var output;

  var img_bg = $('div#preview-1 img:nth-child(1)').prop('src');
  var img_fg = $('div#preview-1 img:nth-child(2)').prop('src');


  $.ajax({
    url: "/blah.php?v=12345,

  }).done(function (data) {

    alert(data); // This gives the correct response
    output = data; // This should take the data value but still be in scope for the return statement below

  });

return output;
}
4

2 に答える 2

2

これは実際にはスコープの問題ではなく、同期性の問題です。

関数が戻ったときgetPreviewImage、ajax呼び出しはまだ行われていません(非同期であり、実行フローは要求と応答が完了するのを待ちません)ので、outputnullのままです。

これを解決するには、同期ajax呼び出しを行うかgetPreviewImage、戻り値を使用する代わりににコールバックを提供します。

同期ajax呼び出しを行うにはfalse、パラメーターとして渡しasyncます。ドキュメントを参照してください。

コールバックを使用するには、次のようにします。

$('img#test').live('click', function(e) {
    e.preventDefault();
    getPreviewImage(function(test){
        // use test
    });
});


function getPreviewImage(callback) {

  $.ajax({
    url: "/blah.php?v=12345",...

  }).done(function (data) {
    callback(data);
  });
}

同期呼び出しを使用する方が簡単です(パラメーターをfalseに設定する必要があります)が、スクリプトをブロックせず、並列要求を許可するため、コールバックロジックが一般的に推奨されます。

于 2012-06-28T14:40:38.883 に答える
1

$.ajaxjQuery関数を使用して別の関数を呼び出すことができます。次のことを試してください。

function getPreviewImage()
{
  var output;

  var img_bg = $('div#preview-1 img:nth-child(1)').prop('src');
  var img_fg = $('div#preview-1 img:nth-child(2)').prop('src');


  $.ajax({
    url: "/blah.php?v=12345,

  }).done(someotherFunction)

  });

}

function someotherFunction(data) {
     return data;
}
于 2012-06-28T14:44:08.063 に答える