1

我在 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

谢谢

4

2 回答 2

1

您不能以这种方式构造函数,因为您依赖于异步调用,这将在正常执行流程之外返回它的结果。您实际接收.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 主题:

如果您围绕 Promise 模式设计代码,一开始您会发现它很复杂,但它为您的代码提供了强大的功能 - 并且解决了您在处理 ajax 调用时最终可能遇到的整个回调堆栈疯狂。

虽然从jQuery.ajax文档中并不完全清楚,但此函数返回一个jqXHR实现 promise 接口的对象。所以这意味着你可以使用 promise 方法donealways并且fail.

于 2013-01-10T08:46:15.073 回答
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 );  
});
于 2013-01-10T08:46:33.160 回答