Javascript 类方法的类型脚本序列
我得到了一个带有属性的typescript类,该属性包含一些连接数据,这些数据是ajax调用的结果,下面是一个片段: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
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;
});
};