2014-12-07 43 views
0

我是整套延迟/承诺原则的新手,但在阅读后我能找到的所有内容都是关于如何使用它们返回ajax数据,而不是JavaScript对象。那可能吗?我们的目标是使下面的代码工作:我可以做一个承诺返回jQuery中的填充对象吗?

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

如果你的操作有时异步有时同步的,那么你就可以回到一个早已解决的承诺的同步路径,然后主叫可以把结果看作是异步的,或者不是。如果结果总是同步产生,那么没有理由使用承诺。 – jfriend00 2014-12-07 19:31:47

+1

哪个诺言味道,你想在答案? ['jQuery.deferred'](http://api.jquery.com/jQuery.Deferred/)? [ES6承诺](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)?承诺/ A +? – 2014-12-07 19:32:17

+0

@FabrícioMattéjQuery.deferred – chacham15 2014-12-07 19:32:39

回答

1

我觉得这样的事情应该工作:

this.getData = function(){ 
    var deferred = $.Deferred(); 
    deferred.resolve(new Binary(this.data)); 
    return deferred.promise(); 
}; 

,而不是返回数据本身,就返回一个promise,在这种情况下早已已经解决,所以done回调可以立即与你解决它的数据调用。

+0

我认为这是我正在寻找的,谢谢! – chacham15 2014-12-07 19:34:56

1

jquery ajax调用返回一个承诺。 如果你想你的文件实例缓存起来,只是“管”到返回

this.getData = function(){ 
    if (!this.dataPromise){ 
     this.dataPromise = $.ajax(url).then(function(data){ 
      return new File(data); 
     }); 
    } 
    return this.dataPromise; 
}; 
相关问题