2012-03-20 127 views
0

我知道这可能是一个愚蠢的问题,我知道JS范围的问题是非常常见的,但是,您是否可以善意地帮助我完成这个任务。Ajax函数内的Javascript变量范围

这里是我的功能:

function checkOpen(storeData) { 
if (storeData.menu === 'true') { 

    var offerImgPath = '/wcsstore/ConsumerDirectStorefrontAssetStore/images/colors/color'+ Brand.styleColour + '/v3/', 
     offer1, 
     offer2; 

    cafeTabContent = '<p>Cafe/Restaurant facilities are available in this store.</p>'; 
    cafeTabContent += '<p class="menu_link"><a href="/store_menus/menu.pdf" target="_blank">Click here to download a menu</a></p>'; 

    if (Brand.storeLocatorSettings.cafeOffersOn === true) { 

     $.ajax({ 
      url : Arcadia.Brand.storeLocatorSettings.offersPageURL, 
      success : function(data) { 
       var offerContainer = $(data).find('#basic_story_content'); 
       offer1 = offerContainer.children(':first-child').attr('src'); 
       offer2 = offerContainer.children(':last-child').attr('src'); 
      } 
     }); 

     console.log(offer1); 

     cafeTabContent += '<p>Current offers:</p>'; 
     cafeTabContent += '<p class="offer_graphic"><img src="' + offer1+ '" alt="Offer 1" /></p>'; 
     cafeTabContent += '<p class="offer_graphic"><img src="' + offer2+ '" alt="Offer 2" /></p>'; 
    } 

    return cafeTabContent; 
} else { 
    return false; 
} 
}; 

是我遇到的问题是,尽管offer1 &供应2被阿贾克斯成功函数外部定义的事实,在这个函数中应用的值不被保留外因此console.log(offer1)返回undefined而不是图像路径。我知道这是一个范围问题,它真的让我烦恼。任何帮助将不胜感激。

+1

谢谢你们,我知道这只是我愚蠢的一个例子。看到你们所有人都给了我正确的答案,我会在Ajinkya看到他的第一个信用点。 – 2012-03-21 09:30:13

回答

1

在Ajax中A意味着异步。
因此,在返回实际数据之前执行控制台语句。这意味着成功返回值后,将分配给offer1和offer2,但您之前已将其打印在控制台上。
试试这个

$.ajax({ 
      url : Arcadia.Brand.storeLocatorSettings.offersPageURL, 
      success : function(data) { 
       var offerContainer = $(data).find('#basic_story_content'); 
       offer1 = offerContainer.children(':first-child').attr('src'); 
       offer2 = offerContainer.children(':last-child').attr('src'); 
     console.log(offer1); 
     console.log(offer2); 
      } 
     }); 
1

你所面对的是不同的(虽然隐约相关的)问题:AJAX的异步特性。

当您的代码调用$.ajax()时,该请求将异步执行,并且代码在请求发送时立即返回。因此offer1offer2仍未定义。

正确的事情就是把任何代码依赖于AJAX导致到您的success回调函数(或称回调从调用的函数)。

1

这不是范围问题。问题在于,当ajax请求完成并且调用回调(设置为offer1offer2)时,console.log(...)内容已经很长时间了。

试着在回调中放入另一个console.log('ajax complete');,并注意它最后被调用。

您可以通过简单地将该函数的其余部分放在回调中来修复它,很可能。