如何从匿名成功函数中更新returnHtml变量?
function getPrice(productId, storeId) {
var returnHtml = '';
jQuery.ajax({
url: "/includes/unit.jsp?" + params,
cache: false,
dataType: "html",
success: function(html){
returnHtml = html;
}
});
return returnHtml;
}
答案 0 :(得分:61)
这是错误的做法。 AJAX中的第一个A是异步的。该函数在AJAX调用返回之前返回(或至少可以)。所以这不是范围问题。这是一个订购问题。只有两个选择:
async: false
选项使AJAX调用同步( 不推荐 );或作为(2)的一个例子:
function findPrice(productId, storeId, callback) {
jQuery.ajax({
url: "/includes/unit.jsp?" + params,
cache: false,
dataType: "html",
success: function(html) {
callback(productId, storeId, html);
}
});
}
function receivePrice(productId, storeId, html) {
alert("Product " + productId + " for storeId " + storeId + " received HTML " + html);
}
findPrice(23, 334, receive_price);
答案 1 :(得分:14)
简短回答,你不能,AJAX中的第一个A代表异步,这意味着当你到达return语句时请求仍然存在。
您可以使用同步(非异步)请求执行此操作,但通常是 Bad Thing
类似下面的oughta返回数据。
function getPrice(productId, storeId) {
var returnHtml = '';
jQuery.ajax({
url: "/includes/unit.jsp?" + params,
async: false,
cache: false,
dataType: "html",
success: function(html){
returnHtml = html;
}
});
return returnHtml;
}
<强> BUT 强>
除非你真的需要能够立即使用测试中的返回值,否则你将更多更好地将回调传递给测试。像
这样的东西function getPrice(productId, storeId, callback) {
jQuery.ajax({
url: "/includes/unit.jsp?" + params,
async: true,
cache: false,
dataType: "html",
success: function(html){
callback(html);
}
});
}
//the you call it like
getPrice(x,y, function(html) {
// do something with the html
}
编辑 Sheesh,你们更快地说出我说的话: - )
答案 2 :(得分:12)
您的匿名函数 可以访问其范围内的returnHtml
变量,因此其中的代码实际上正如您所期望的那样工作。你可能出错的地方在你的退货声明中。
请记住, AJAX 中的 A 代表asynchronous
,这意味着它不会同时发生。出于这个原因,行returnHtml = html
实际上是在>> <{1>}之后发生,因此return returnHtml;
仍然是一个空字符串。
很难说你应该怎么做才能让你的工作在你看来没有看到你的其余代码,但你可以做的是为函数添加另一个回调:
returnHtml