Javascript Can';除了函数本身,不要在jQuery的.ajax方法中的任何地方使用返回的数据

Javascript Can';除了函数本身,不要在jQuery的.ajax方法中的任何地方使用返回的数据,javascript,jquery,scope,Javascript,Jquery,Scope,非常奇怪的问题是,除了在.ajax函数本身中,我不能在任何地方使用数据变量(ajax调用返回的信息) 我相信这是一个范围的问题,但这是一个超出我的范围的问题,如果有任何指点,我将不胜感激 $('img#test').live('click', function(e) { e.preventDefault(); var test = getPreviewImage(); alert(test); // This just gives undefined }); func

非常奇怪的问题是,除了在.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;
}

这实际上不是一个范围问题,而是一个同步性问题

getPreviewImage
函数返回时,ajax调用尚未发出(它是异步的,执行流不会等待请求和响应完成),因此
output
仍然为空

您可以通过进行同步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),但回调逻辑通常更可取,因为它不会阻止脚本并允许并行请求。

您可以使用
$.ajax
jQuery函数调用另一个函数。尝试执行以下操作

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;
}

我刚刚理解了您的示例是如何工作的。很好的工作,为我很好地说明了一个新的JS概念。谢谢