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:

  1. 使用async: false选项使AJAX调用同步( 不推荐 ); 要么
  2. 改变你的思维方式。 而不是从函数返回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,你们更快地说出我所说的:-)

你的匿名函数可以访问其范围内的returnHtmlvariables,所以这里的代码实际上正如你所期望的那样工作。 你可能会出错的地方就在你的退货声明中。

请记住, 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); });