2012-06-07 91 views
2

新的jQuery和简单但令人困惑的问题。 HA2。jquery函数访问本地JavaScript变量

我正在用jQuery函数读取xml文件来编写这个正常的javascript函数。如何为顶部声明的prodPrice变量赋值?该脚本保持返回0值,但如果我提醒jQuery函数内的值,我设法得到我想要的值。

谢谢你们。

function getPrice(valprodID) 
{ 
    var prodPrice=0; 

    jQuery.ajax({ 
     type: "GET", 
     url: "products.xml", 
     dataType : "xml", 
     success : function(xml) 
     { 
      jQuery(xml).find('prod').each(function(){ 
       var prodID = jQuery(this).find('prodID').text(); 
       if(prodID == valprodID) 
       { 
        prodPrice = jQuery(this).find('prodPrice').text(); 
        return false; 
       } 
      });     
     } 
    }) 

    return prodPrice; 
} 

回答

0

您可以按照@xdazz报告的方式进行异步操作,因为@zerkms用延迟或匿名函数表示:

function getPrice(valprodID, fn) 
{ 
    var prodPrice=0; 
    jQuery.ajax({ 
     type: "GET", 
     url: "products.xml", 
     dataType : "xml", 
     success : function(xml) 
     { 
      jQuery(xml).find('prod').each(function(){ 
       var prodID = jQuery(this).find('prodID').text(); 
       if(prodID == valprodID) 
       { 
        prodPrice = jQuery(this).find('prodPrice').text(); 
        fn(prodPrice); 
       } 
      });     
     } 
    }) 

} 

getPrice(1, function(prodPrice) { 

    /* your code */ 

}) 
+0

是的,它的工作原理。我可以调用函数getPrice。和@zerkms例子一样,浏览器不断弹出未定义的getPrice函数。这两个例子有什么区别? –

+0

“@zerkms”的示例使用在版本1.5(http://api.jquery.com/category/deferred-object/)中实现的Deferred。我的例子比较常见,用一个匿名函数调用函数“getPrice”。你必须知道这两者是异步的,因为你异步使用$ .ajax –

+0

@PapaShop在你遇到的例子中,“zerkms”使用了来自版本1.6(http://api.jquery)的“pipe”方法。 COM/deferred.pipe /)。你必须看看jQuery使用的是什么版本。你可以在没有方法“pipe”的情况下使用它,这里是一个基于“zerkms”代码的例子:http://jsfiddle.net/adescalzo/9MgsX/4/ –

0

您需要将async选项设置为false,或者你应该做你的工作在回调函数。

2

这是因为$.ajax是异步执行的。

而且这是一个很好的机会,你要学会如何与$.Deferred

function getPrice(valprodID) 
{ 
    var prodPrice=0; 

    return jQuery.ajax({ 
     type: "GET", 
     url: "products.xml", 
     dataType : "xml" 
    }).pipe(function(xml) 
     { 
      jQuery(xml).find('prod').each(function(){ 
       var prodID = jQuery(this).find('prodID').text(); 
       if(prodID == valprodID) 
       { 
        return jQuery(this).find('prodPrice').text(); 
       } 
      });     
     }); 
} 

工作,现在你骂你的getPrice()功能以这样的方式

getPrice(someid).done(function(prodPrice) { 
    // do what you need with prodPrice 
}); 

这里是的jsfiddle一个例子: http://jsfiddle.net/zerkms/9MgsX/1/

+0

太棒了!但是,为什么你在'getPrice()'中把'var prodPrice = 0'声明留给了? –

+0

@Ryan Fernandes:其实我无法理解它是什么:-S所以得到一些通用的答案PS:还加了一个例子 – zerkms

+0

@Ryan Fernandes:如果你喜欢这些承诺,我建议你看看这篇文章http ://joseoncode.com/2011/09/26/a-walkthrough-jquery-deferred-and-promise/这是惊人的 – zerkms