我有一个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回调中:两个函数应该分开
答案 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);
});