类方法的打字稿序列

Typescript sequence of a Class methods

本文关键字:类方法      更新时间:2023-09-26

我得到了一个打字稿类,其属性包含一些连接数据,这些数据是 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回调中:两个函数应该分开

调用代码应该将承诺与 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承诺作为必需参数传递给request方法:

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

并致电:

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

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

最后一个示例(基于注释的重用连接的愿望)。将前面的答案组合成这样:

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

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

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

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

3) 请求方法与前面的示例没有变化:

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

一旦你进入应许之地,你需要留在那里(或使用回调):

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;
        })
    }
}

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

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