Javascript Can';除了函数本身,不要在jQuery的.ajax方法中的任何地方使用返回的数据
非常奇怪的问题是,除了在.ajax函数本身中,我不能在任何地方使用数据变量(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
$('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概念。谢谢