jQuery ajax成功匿名函数范围

时间:2009-09-22 01:21:51

标签: jquery ajax

如何从匿名成功函数中更新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;
}

3 个答案:

答案 0 :(得分:61)

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

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