2014-12-07 2 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

+1

Какой вкус обещаний вам нужен? [ 'JQuery.deferred'] (http://api.jquery.com/jQuery.Deferred/)? [ES6 Promises] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)? Обещания/A +? –

+0

@ FabrícioMatté jQuery.deferred – chacham15

ответ

1

Я думаю, что-то, как это должно работать:

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

Вместо возвращения самих данных, вы возвращаете promise, который в этом случае имеет уже было разрешено, поэтому обратный вызов done можно вызвать сразу же с данными, с которыми вы его разрешаете.

+0

Я думаю, что это то, что я ищу, спасибо! – chacham15

1

jquery ajax call возвращает обещание. Если вы хотите кэшировать его, просто «труба» экземпляр файла в возвращении

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