javascript - 在 Ember 模型的计算属性中使用 Promise

标签 javascript ember.js

我有一个模型,我们称之为任务,它有一个属性受让人。我有另一个模型管理员,那是一组管理员。在任务中,我想添加一个属性 admin,它通过电子邮件从管理员中查找受让人并返回该管理员。

Admin 上的主键不是电子邮件,在 Ember 模型中,看起来不可能在主键以外的任何键上创建 belongsTo 关联。我通过电子邮件而不是 ID 发送的原因是管理员并不总是存在。

任务模型看起来像这样:

import Em from 'ember';
import Admin from 'project/models/admin';
import PromiseObject from 'project/lib/promise-object';

var Task = Em.Model.extend({
  id: Em.attr(),
  name: Em.attr(),
  assignee: Em.attr(),
  admin: function() {
    return PromiseObject.create({
      promise: Admin.fetch({ email: this.get('assignee') })
    }).then(function(json) {
      return Admin.create(json);
    }, function() {
      return null;
    });
  }.property('assignee'),
  adminName: Em.computed.oneWay('admin.name')
});

export default Task;

PromiseObject 只是扩展 PromiseProxyMixin,看起来像这样:

import Em from 'ember';
export default Em.ObjectProxy.extend(Em.PromiseProxyMixin);

当我尝试访问该属性时,我可以看到管理员的网络请求通过网络传输,并且我可以看到包含正确详细信息的成功响应。但是, promise 会返回 null

我希望在我的模板中包含 {{task.adminName}}。在这一点上,我对在我的模型中正确解决管理 promise 的最佳方式感到困惑。

最佳答案

您返回的不是 PromiseObject,而是一个链式 promise 。您应该只返回 PromiseObject

admin: function() {
  var promise = $.getJSON("/admin").then(function(json) {
    return Admin.create(json);
  }, function() {
    return null;
  });

  return PromiseObject.create({
    promise: promise
  });
}.property('assignee'),

示例:http://emberjs.jsbin.com/nobima/12/edit

将 Ember 模型 fetch 与对象一起使用会返回一个集合,而不是模型(当然除非您要获取的不是 Ember 模型)。所以 json 不是此时返回的内容。您可能想按照这些思路做些事情。

admin: function() {
  var promise = Admin.fetch({ email: this.get('assignee') }).then(function(collection){
    return collection.get('firstObject');
  }, function() {
    return null;
  });

  return PromiseObject.create({
    promise: promise
  });
}.property('assignee'),

关于javascript - 在 Ember 模型的计算属性中使用 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26792117/

相关文章:

javascript 闭包和局部变量 'remembering'

javascript - REST API 创建一个或多个资源?

javascript - Google map v3 fitBounds 缩放不一致

javascript - 找不到变量 : Promise on iOS 7

javascript - Ember.js有很多关系数据使用fixture显示

javascript - 如何在没有容器对象的情况下在每个循环中渲染 View ?

javascript - 使用 Promises 对 Ember 对象数组进行排序

javascript - 在 vue.js 中捕获 radio 输入值

javascript - 用逗号分割字符串并格式化后显示

ember.js - 在 emberdata 中保留 hasMany 关联