2009-09-22 137 views
34

如何更新匿名成功函数中的returnHtml变量?jQuery ajax成功匿名函数范围

function getPrice(productId, storeId) { 
    var returnHtml = ''; 

    jQuery.ajax({ 
     url: "/includes/unit.jsp?" + params, 
     cache: false, 
     dataType: "html", 
     success: function(html){ 
      returnHtml = html; 
     } 
    }); 

    return returnHtml; 
} 

回答

54

这是错误的方法。 AJAX中的第一个A是异步的。该函数在AJAX调用返回(或至少可以)之前返回。所以这不是范围问题。这是一个订购问题。只有两种选择:

  1. 使AJAX调用同步(不推荐)与async: false选项;或
  2. 改变你的思维方式。而不是从函数返回HTML,您需要传递一个回调,以便在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

Gotchya - 我想我必须这样做。但如果我必须这样做呢? – 2009-09-22 01:29:04

+0

如果不知道你打算如何使用getPrice()方法,很难回答。它用于什么?它是如何使用的?它是需要调整的“外层”代码。 – cletus 2009-09-22 01:30:05

+0

好吧,我明白了。我没有意识到productId和storeId会在范围内,我实际上可以将这些东西传递给回调。 – 2009-09-22 01:42:36

11

您的匿名函数有确实有机会获得returnHtml变量在其范围内,所以代码中有实际工作,你会期望。你可能会出错的地方在你的退货声明中。

记住一个AJAX代表asynchronous,这意味着它不会在同一时间发生。出于这个原因,行returnHtml = html实际上是之后你调用return returnHtml;,所以returnHtml仍然是一个空字符串。

这很难说,你应该做的事,你要得到这个工作,没有看到你的代码的其余部分,但你可以做的是增加一个回调函数:

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

简短的回答,你不能,AJAX中的第一个A代表异步,这意味着当你到达返回语句时请求仍然在进行。

可以与同步(非异步)要求这样做,但它通常是一个坏事

类似下面现在应该返回数据。

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

除非你真的很需要能够使用从测试的返回值直线距离,你会更好传递一个回调到测试。喜欢的东西

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 
} 

编辑啧,你们是更快地说什么我说:-)

+0

将设置浏览器渲染的'async:false'块页面吗? – 2015-01-14 12:47:29

+0

@Ramswaroop我相信是的 – 2015-01-15 00:42:42