类方法的打字稿序列
Typescript sequence of a Class methods
我得到了一个打字稿类,其属性包含一些连接数据,这些数据是 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 请求函数很糟糕(我没有清理它但删除了返回),因为它可能是异步的,即它要么返回一个值,要么做一些异步工作。最好保持一致并始终保持异步。
- 使构造函数参数具有ES6类方法的特权
- 可以“;超级“;可以在子类的方法内部使用,在不直接引用的情况下调用相应的超类方法
- Javascript中的类方法
- 在 Array.map() 中调用类方法
- 从类方法中的 ajax post 函数回调函数更改 javascript 类属性
- 类方法中的上下文作为变量
- 如何将类方法设置为等于多个函数?-Javascript
- 将类方法绑定到类外绑定的事件处理程序内的AJAX成功回调
- Node.JS:类方法作为回调
- 如何从将在html页面中使用的java脚本中调用java类方法
- 在类方法中使用React.js静态
- 在不使用@syntax的情况下修饰ES6类方法
- 如何使用jQuery通过ajax调用php类方法,但不需要任何php处理程序文件
- 从常规ES6类方法中调用静态方法
- crypto-js如何隐藏类方法
- 当使用Q/promises/异步函数时,如何将一个值从一个类方法返回到另一个类
- 使用javascript创建自己的隐藏类方法
- javascript ES6类/方法范围
- 使用 .call/.apply 隐藏类方法
- 我应该如何从 html 调用 javascript 类方法