Ember Data计算属性中的承诺结果

cod*_*rts 3 ember.js ember-data

我正在尝试调用外部API,并将结果用作Ember Data模型中的计算属性。可以很好地获取结果,但是在Promise解析之前返回了计算的属性,从而导致未定义。这是观察员的用例吗?

export default DS.Model.extend({
  lat: DS.attr(),
  lng: DS.attr(),
  address: Ember.computed('lat', 'lng', function() {
    var url = `http://foo.com/json?param=${this.get('lat')},${this.get('lng')}`;
    var addr;

    var request = new Ember.RSVP.Promise(function(resolve, reject) {             
        Ember.$.ajax(url, {                                                        
          success: function(response) {                                            
            resolve(response);                                                     
          },                                                                       
          error: function(reason) {                                                
            reject(reason);                                                        
          }                                                                        
        });                                                                        
     });                                                                          

     request.then(function(response) {                      
       addr = response.results[0].formatted_address;                              
     }, function(error) {                                                         
       console.log(error);
     })  

     return addr;
  })
});
Run Code Online (Sandbox Code Playgroud)

Max*_*ace 5

使用DS.PromiseObject。我一直使用以下技术:

import DS from 'ember-data';

export default DS.Model.extend({

  ...

  address: Ember.computed('lat', 'lng', function() {
    var request = new Ember.RSVP.Promise(function(resolve, reject) {             
      ...
    });                                                                          

    return DS.PromiseObject.create({ promise: request });
  }),

});
Run Code Online (Sandbox Code Playgroud)

将模板中的已解析值用作{{address.content}},这将在代理Promise解析后自动更新。

如果您想在此处执行更多操作,建议您查看社区中其他人在做什么:https : //emberobserver.com/?query=promise

构建一个简单的Component接受一个a DS.PromiseObject并在Promise仍处于待处理状态时显示一个加载微调器,然后在Promise解析后显示实际值(或屈服于一个块),这并不是很困难。

我正在使用Ember.Service的应用程序中有一个应用程序,它几乎完全由计算属性组成,这些属性返回包装在DS.PromiseObjects中的Promises。它出奇地无缝地工作。