2013-01-10 41 views
1

我有小问题,在一个JavaScript对象(类)方法之间的数据交换:如何使用属性和方法与JavaScript类交换数据?

var TEST = (function() { 

    var TEST = function() { 

    }; 

    TEST.prototype.get = function() { 
     $.ajax({ 
      type: "GET", 
      url: "http://test.com/getall", 
      dataType: "json", 
      success: function (data) { 
       return data; // if i console log this i will get a json obj 
      } 
     }); 
    }; 

    TEST.prototype.parse = function(data) { 
     $.each(this.get(), function(k, v){ 
      console.log(v); 
     }); 
    }; 

    return TEST; 
})(); 

,所以我试图调用一个方法在另一种方法的每个语句。问题是

答案是undefined

我也试过这样的,但他同样的结果

var testing = new TEST(); 
var get = testing.get(); 
testing.parse(get); 

我失去了什么?我如何从this.get返回数据用于this.parse

感谢

回答

1

$.ajax()每默认是异步的。这意味着,您的功能get()的执行不会等到请求完成。因此,您不返回任何值,导致返回undefined

为了让你的get()函数能够返回一个值,你必须以同步方式完成请求并在外部函数中设置一个变量(因为成功本身就是另一个函数,它的返回值是没有抓到):

TEST.prototype.get = function() { 
     var result; 

     $.ajax({ 
      type: "GET", 
      url: "http://test.com/getall", 
      async: false, // this is the important part! 
      dataType: "json", 
      success: function (data) { 
       result = data; 
      } 
     }); 

     return result; 
    }; 

编辑

正如@pebbl提到的,这将停止所有脚本执行,直到请求被完成。因此,您的整个页面暂时会被阻止。

一般的做法是在这种情况下使用回调,一旦请求完成,就会执行回调。所以你的情况是这样的:

TEST.prototype.get = function(cb) { 
     $.ajax({ 
      type: "GET", 
      url: "http://test.com/getall", 
      dataType: "json", 
      success: function (data) { 
       cb(data); 
      } 
     }); 
    }; 

与后来调用是这样的:

var testing = new TEST(); 
testing.get(function(data) { 
    testing.parse(data); 
}); 
+0

它的工作原理。谢谢 – Patrioticcow

+0

我不会亲自推荐这条路线,因为我确信您知道这会导致代码挂起,直到ajax调用完成。这可能会导致旧版浏览器出现更多问题。 – Pebbl

+0

@pebbl你会推荐什么? – Patrioticcow

1

你不能建造你的函数这种方式,你是靠一个asyncronous调用,将返回它产生的正常执行流程之外。您实际可以收到您的.get函数的结果的唯一方法是使用回调。

简单地说,您的值不是从.get函数返回的,它是从您传递给jQuery的.ajax方法的回调中返回的。

为了继续支持异步调用 - 而不是禁用异步,您将更好地重新设计代码。

一个粗略的想法是改变你的解析功能,像这样:

TEST.prototype.parse = function(data) { 
    this.get(function(result){ 
     $.each(result, function(k, v){ 
      console.log(v); 
     }); 
    }); 
}; 

,并相应地改变你的get函数:

TEST.prototype.get = function(callback) { 
    $.ajax({ 
     type: "GET", 
     url: "http://test.com/getall", 
     dataType: "json", 
     success: callback 
    }); 
}; 

以上仅仅是一个简单的例子,你会明智地阅读以下jQuery主题:

如果你设计围绕承诺模式的代码,你会发现它复杂在第一,但它可以让你在你的代码很大的权力 - 和周围的整体回调得到堆积疯狂,你可以在处理ajax调用时结束。

虽然从jQuery.ajax文档中未能完全清楚,但此函数返回一个jqXHR对象,该对象实现承诺接口。所以这意味着您可以使用承诺方法done,alwaysfail

相关问题