我是整套Deferred / Promise原则的新手,但在阅读完所有内容后,我发现它是关于如何使用它们来返回ajax数据,而不是javascript对象。那可能吗?目标是使以下代码工作:
var Binary = function(data){
this.data = data;
}
var File = function(url){
this.data = null;
this.url = url;
this.getData = function(){
// return either cached version at this.data or fetch it
}
}
// the goal is to make the following possible:
var url = "http://www.google.com/humans.txt";
var file = new File(url);
file.getData().done(function(binary){ //binary should be equals to `new Binary(data)`
alert("we got binary data object with the data being: " + binary.data);
});
答案 0 :(得分:1)
我认为这样的事情应该有效:
this.getData = function(){
var deferred = $.Deferred();
deferred.resolve(new Binary(this.data));
return deferred.promise();
};
不是返回数据本身,而是返回promise
,在这种情况下已经解决,因此可以使用您解析数据立即调用done
回调。
答案 1 :(得分:1)
jquery ajax调用返回一个promise。 如果你想缓存它,只需要管道即可。你的文件实例进入了返回
this.getData = function(){
if (!this.dataPromise){
this.dataPromise = $.ajax(url).then(function(data){
return new File(data);
});
}
return this.dataPromise;
};