2009-09-22 132 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