2011-03-28 81 views
1

我有以下方法:的javascript&jQuery的范围问题

function priceRange(FESTIVALID){ 
         jQuery.ajax({ 
          url  : '/actions/festheads.cfc?method=getPriceRangeByGUID', 
          type : 'POST', 
          data : 'FESTIVALID='+FESTIVALID, 
          dataType: 'json', 
          success : function(data) { 
           console.info("AJAX:qPrices",data.MINPRICE); 

            formatedPriceRange = '$ '+data.MINPRICE; 
            console.info("AJAX:formatedPriceRange", formatedPriceRange); 

           }//success 
          });//ajax; 


        // 
        return formatedPriceRange; 
       }; 

第二console.info正确显示formatedPriceRange, 但功能以外是未定义的。

如何在priceRange函数外部访问此变量? 谢谢

回答

1
  1. 你必须确保在AJAX请求之前完成您访问价格范围数据。
  2. 您需要公开success函数范围之外的价格范围数据。

这里是你如何能做到这一点:

function priceRange(FESTIVALID, callback) { 
    jQuery.ajax({ 
     url: '/actions/festheads.cfc?method=getPriceRangeByGUID', 
     type: 'POST', 
     data: 'FESTIVALID=' + FESTIVALID, 
     dataType: 'json', 
     success: function(data) { 
      console.info("AJAX:qPrices", data.MINPRICE); 
      formatedPriceRange = '$ ' + data.MINPRICE; 
      console.info("AJAX:formatedPriceRange", formatedPriceRange); 
      callback.call(this, formatedPriceRange); 
     } //success 
    }); //ajax; 
} 

var myFestivalID = 1; 
priceRange(myFestivalID, function(priceRange) { 
    // this code runs when the ajax call is complete 
    alert('The formatted price range is:' + priceRange); 
}); 
2

这是正常的,这就是AJAX的工作原理。它是异步的,这意味着jQuery.ajax函数立即返回,在这种情况下formatedPriceRange尚未分配一个值,并且一旦服务器响应(可能例如10秒钟后),将调用成功回调并为该变量分配一个值值。

因此,请务必在success回调函数内消耗您的AJAX请求的结果。

您还可以将async: false选项传递给jQuery.ajax调用,该调用将执行对服务器的同步请求并阻塞,直到检索结果。很明显,这将导致您的浏览器在执行请求期间被冻结。所以它不再是AJAX(异步Javascript和Xml),而是SJAX(同步Javascript和Xml)。

1

我怎样才能访问这个变量出 方priceRange函数?

像Darin说的,你必须在success回调函数中使用你的结果。

假设你正在使用当前的功能是这样的:

var range = priceRange(festivalId); 
    // ... doing stuff with range variable 

你会想重新组织你的代码,因此任何你与range变量做从success回调茎。例如,你可以创建一个函数来处理与新范围更新UI:

function handleRangeVariabe(range) { 
    /// ... do stuff with range variable 
} 

调用它从success

success: function(data) { 
    console.info("AJAX:qPrices",data.MINPRICE); 
    formatedPriceRange = '$ '+data.MINPRICE; 
    console.info("AJAX:formatedPriceRange", formatedPriceRange); 

    handleRangeVariable(formatedPriceRange); 
} 
1

花示例代码的步骤:

 //declare function 
function priceRange(FESTIVALID, functionCallBack){ 
    //1º step 
    jQuery.ajax({ 
     url  : '/actions/festheads.cfc?method=getPriceRangeByGUID', 
     type : 'POST', 
     data : 'FESTIVALID='+FESTIVALID, 
     dataType: 'json', 
     success : function(data) { 

      //3º step, because this function will only trigger when server responds to request 
      //handle data in other function 
      functionCallBack(data); 

      }//success 
     });//ajax; 

    //more code 
    //2º step 

    //no return value, because this method no know when the data will return of server 
    //return formatedPriceRange; 
}; 

var formatedPriceRange; 
//using function 
princeRange(1 , function(data){ 
    console.info("AJAX:qPrices",data.MINPRICE); 
    formatedPriceRange = '$ '+data.MINPRICE; 
    console.info("AJAX:formatedPriceRange", formatedPriceRange); 
});