Javascript 类方法的类型脚本序列

Javascript 类方法的类型脚本序列,javascript,class,methods,callback,typescript,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(funct

我得到了一个带有属性的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()。任何建议都将不胜感激


PS:我不能将
request()
函数放在ajax回调函数中:一旦进入promise land,这两个函数应该分开,您需要留在那里(或使用回调):

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


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

调用代码应该将承诺与
结合起来,然后是
connect()
request()
应该只是回报他们的承诺。e、 g.他们“承诺在连接时返回完成”和“承诺返回请求的数据”。在
请求
的情况下,它不需要
延迟的
对象或承诺,因为它只是立即返回一个值

JSFIDLE示例:

然后像这样使用:

connect().then(request).done(function(data){
    alert(data);
});
因此,在您的情况下,只需从
connect()
返回ajax调用结果作为承诺:

request
只返回字符串:

request() {
    return '?id=' + User.data.id + '&token=' + User.data.token;
}
另一种方法是保存
connect
承诺:

var promise = connect();
并在您想要获取
请求
数据时使用它:

promise.then(request).done(function(data){
    alert(data);
});
如果您的
请求
依赖于“连接”,则更好的方法是将
连接
承诺作为所需参数传递给
请求
方法:

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

request(connect()).done(function(data){
   alert(data);
});
此处使用此方法的示例:

最后一个示例(基于重复使用连接的愿望)。将前面的答案组合如下:

connect().then(request).done(function(data){
    alert(data);
});
1) 将连接另存为对象的属性

// Start the connection process and save the promise for re-use
var connectionPromise = connect();
2) 将连接用作请求的参数(因此它们不需要了解外部变量):

3) 请求方法与上一示例相同:

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

你说我需要遵守诺言或者回电话。。巫婆方法更好?@basarat:承诺应该被链接起来,而不是通过添加依赖项(在您的例子中是
connectedPromise
变量)来缝合在一起。我们添加了一个示例。另外,
setTimeout
代码只是在没有承诺的情况下才需要的(它只是递归地轮询以完成连接)。您只需要
返回'?id='+User.data.id+'&token='+User.data.token
。就像我说的。我没有清理:)Tnx对于你的答案,我将深入研究这些论点。在您的代码中,每个请求都会尝试并等待连接被解决,但这对我来说并不好,因为在我的代码中,我需要一个初始连接就可以发出几个“request()”,而问题就在于第一个请求(因为有时连接数据还没有准备好)@Plastic:我会根据您对重复使用连接的渴望添加额外选项。非常感谢您,我在这里的第一个目标是学习一些有用的东西;)
// Start the connection process and save the promise for re-use
var connectionPromise = connect();
// Make a request, passing the connection promise
request(connectionPromise).done(function(data){
   alert(data);
});
request(connectionPromise){
    return connectionPromise.then(function(){
         return '?id=' + User.data.id + '&token=' + User.data.token;
    });
};