jQuery ajax成功匿名函数的作用域
如何更新匿名成功函数中的returnHtmlvariables?
function getPrice(productId, storeId) { var returnHtml = ''; jQuery.ajax({ url: "/includes/unit.jsp?" + params, cache: false, dataType: "html", success: function(html){ returnHtml = html; } }); return returnHtml; }
这是错误的方法。 AJAX中的第一个A是asynchronous的。 该函数在AJAX调用返回(或至less可以)之前返回。 所以这不是一个范围问题。 这是一个订购的问题。 只有两个select:
- 使用
async: false
选项使AJAX调用同步( 不推荐 ); 要么 - 改变你的思维方式。 而不是从函数返回HTML,你需要传递一个callback,当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);
简而言之,您不能,AJAX中的第一个A代表asynchronous,这意味着当您到达返回语句时请求仍然在进行。
你可以用同步(非asynchronous)请求来完成,但这通常是一件坏事
像下面的那样应该返回数据。
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; }
但
除非你真的需要马上使用testing的返回值,否则将callbacktesting的效果会更好。 就像是
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,你们更快地说出我所说的:-)
你的匿名函数可以访问其范围内的returnHtml
variables,所以这里的代码实际上正如你所期望的那样工作。 你可能会出错的地方就在你的退货声明中。
请记住, AJAX中的A代表asynchronous
,这意味着它不会同时发生。 因此, returnHtml = html
这一行实际上是在你调用return returnHtml;
后发生的return returnHtml;
,所以returnHtml
仍然是一个空string。
很难说如果没有看到代码的其余部分,你应该怎么做才能让它工作,但是你可以做的是给函数添加另一个callback函数:
function getPrice(productId, storeId, callback) { jQuery.ajax({ url: "/includes/unit.jsp?" + params, cache: false, dataType: "html", success: callback }); } getPrice(5, 1, function(html) { alert(html); });