Class方法的Typescript序列

时间:2014-12-22 23:59:56

标签: javascript class methods callback typescript

我有一个typescript类,其属性包含一些ajax调用结果的连接数据,这里是一个片段:

class User {
    // ... other stuff (constructor, attributes, methods)
    static data:{id:number; token:string} = {id: 0, token: ""};
    connect() {
        // Ajax Call
        .done(function(e){
            User.data.id = e.id;
            User.data.token = e.token;
        })
    }
    request() {
        if(User.data.id == 0)
            setTimeout(() => { 
                this.request();
            }, 500);
        else return  '?id=' + User.data.id + '&token=' + User.data.token;
    }
}

我尝试使用connect(),然后使用request(),但有时request()函数在ajax的答案之前启动。现在我正在尝试用一些等待时间和一种递归来编写request()函数。不幸的是它不起作用..我的目标是调用request()函数并仅在“id”和“token”准备就绪时获取字符串(不是0和空字符串)。任何建议将不胜感激!

PS:我不能把request()函数放在ajax回调中:两个函数应该分开

2 个答案:

答案 0 :(得分:0)

一旦你处于承诺之地,你需要留在那里(或使用回调):

class User {
    // ... other stuff (constructor, attributes, methods)
    static data: { id: number; token: string } = { id: 0, token: "" };

    private connectedPromise;
    connect() {
        // Ajax Call
        this.connectedPromise = something.done( function ( e ) {
            User.data.id = e.id;
            User.data.token = e.token;
        })
    }
    request() {
        this.connectedPromise.then( () => {
            if ( User.data.id == 0 )
                setTimeout( () => {
                    this.request();
                }, 500 );
            else return '?id=' + User.data.id + '&token=' + User.data.token;
        })
    }
}

如果connect已解决,则将连接结果存储在var中,仅执行请求。

PS 请求函数不好(我没有清理它但删除了返回),因为它可能是异步,即它返回一个值或者是一些异步工作。最好保持一致,始终是异步的。

答案 1 :(得分:0)

调用代码应该将promise与then组合在一起。 connect()request()应该回报他们的承诺。例如他们"承诺在连接时返回完成"并且"承诺返回所请求的数据"。在request的情况下,它不需要deferred对象或承诺,因为它只是立即返回一个值。

JSFiddle示例:http://jsfiddle.net/TrueBlueAussie/qcjrLv4k/3/

// Return a fake connection after 5 seconds
var connect = function (){
    var def = $.Deferred();
    setTimeout(function(){
        def.resolve();
    }, 5000);
    return def.promise();
}

var request = function(){
    return "?data=d";
}

并使用如下:

connect().then(request).done(function(data){
    alert(data);
});

所以在你的情况下,只需将ajax调用结果作为connect()的承诺返回:

   connect() {
        return $.ajax({[snipped]})
        .done(function(e){
            User.data.id = e.id;
            User.data.token = e.token;
        });
    }

request只返回字符串:

request() {
    return '?id=' + User.data.id + '&token=' + User.data.token;
}

另一种方法是保存connect承诺:

var promise = connect();

并在您想要获取request数据时使用它:

promise.then(request).done(function(data){
    alert(data);
});

更好的方式,如果您的request依赖于"连接",则将connect承诺传递给{{1}方法作为必需参数:

request

并致电:

request(connectionPromise){
    return connectionPromise.then(function(){
         return '?id=' + User.data.id + '&token=' + User.data.token;
    });
};

此处使用此方法的示例:http://jsfiddle.net/TrueBlueAussie/qcjrLv4k/4/

最终示例(基于注释重用连接的愿望)。结合以前的答案:

1)将连接保存为对象的属性。

request(connect()).done(function(data){
   alert(data);
});

2)使用连接作为请求的参数(因此他们不需要了解外部变量):

// Start the connection process and save the promise for re-use
var connectionPromise = connect();

3)请求方法与前一个示例相比没有变化:

// Make a request, passing the connection promise
request(connectionPromise).done(function(data){
   alert(data);
});