2013-12-15 3 views
2

Я пытаюсь создать User.current() в своем приложении, которое извлекает данные с моего сервера с помощью $.getJSON('/users/current', function(data) { ... });. Я использую метод Singleton, который использует Дискурс, который делает следующее:Как вернуть отложенное обещание и создать модель с Ember.Deferred?

Dashboard.Singleton = Ember.Mixin.create({ 
     // See https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/mixins/singleton.js 

     current: function() { 
       if (!this._current) { 
         this._current = this.createCurrent(); 
       } 
       return this._current; 
     }, 

     createCurrent: function() { 
       return this.create({}); 
     } 
}); 

И в моей User модели одиночки, я переписан createCurrent следующим образом:

Dashboard.User.reopenClass(Dashboard.Singleton, { 
     createCurrent: function() { 
       return Ember.Deferred.promise(function(p) { 
         return p.resolve($.getJSON('/users/current').then(function(data) { 
           return Dashboard.User.create(data); 
         })); 
       }); 
     } 
}); 

Пользователь нормальный объект Ember модель:

Dashboard.User = Ember.Object.extend({ 

}); 

Это делает запросить данные с сервера, но функция не устанавливает User.current() правильно - когда я его проверяю, User.current() не имеет никаких свойств, которые должны быть установлены, например name.

Как я могу вернуться и установить текущего пользователя с помощью отсрочки и обещаний Эмбера?

+0

Что такое пользовательская модель? Простой объект Ember? – Kingpin2k

+0

Да. Я обновлю вопрос, что такое «Пользователь». – josh

ответ

0

Это потому, что вы возвращаете обещание вместо пользователя.

Почему бы вам не создать пользователя, а затем заполнить его позже.

Или использовать шаблон Promise прокси, который использует Ember данных (обещание может быть использовано в качестве объекта один раз разрешен)

DS.PromiseObject = Ember.ObjectProxy.extend(Ember.PromiseProxyMixin); 

function promiseObject(promise) { 
    return DS.PromiseObject.create({ promise: promise }); 
} 
+0

Должен ли я вернуть обещание, что пользователь будет возвращен? – josh

+0

, если вы хотите, но тогда вам всегда придется получить доступ к модели с помощью prom.then (function (record) {// здесь}})); – Kingpin2k

+0

, который может быть тем, что вы хотите, если вы всегда хотите подождать, пока пользователь не будет определен – Kingpin2k

0

С $ .getJSON ('/ пользователей/ток') возвращает обещание, может также используем это.

createCurrent: function() { 
       return $.getJSON('/users/current').then(function(data) { 
         return Dashboard.User.create(data); 
       }); 
    } 

Тогда вы должны иметь в виду, что createCurrent возвращает обещание, а не сам по себе, так что вы должны будете объектную:

current: function() { 
      if (!this._current) { 
        var that = this; 
        this.fetching = true; 
        this.createCurrent().then(function(val) { 
         that.fetching = false; 
         that._current = val; 
        }); 
      } 
      return this._current; 
    }, 
+0

текущий будет возвращен undefined до тех пор, пока обещание не будет разрешено, этот код не запускается асинхронно. – Kingpin2k

+0

i know current будет неопределенным до тех пор, пока обещание не будет устранено. Почему это проблема? ссылаясь на то, что не выполняется асинхронно? – RHollister

+0

Потому что, когда вы звоните, this.current() вы создадите новый экземпляр, создавая новый вызов ajax до тех пор, пока он не будет разрешен, и вы будете продолжать получать неопределенные данные. – Kingpin2k

Смежные вопросы