javascript - 使用返回的 promise 数据

标签 javascript ember.js promise

我有这样的东西:

App.IndexController = Ember.ObjectController.extend({
   results : function(){

      return new Ember.RSVP.Promise(function(resolve, reject){

        Ember.$.getJSON('/search').then(function(res){
          console.log('response data is: ', res);
          resolve(res)
        })

      })

   }.property(),
  ...
})

// data
$.mockjax({
  url: '/search',
  responseText : {
    type: 'different people',
    res: [
      {name: 'charlie', age: '55'},
      {name: 'bobby', age: '19'},
      {name: 'raymond', age: '39'}
    ]
  }
})

my jsbin

我如何实际使用返回的数据?目前,results 返回一个 promise ( this.get('results') ),因此我无法在我的 hbs 模板中使用它。我需要将其转换为对象然后返回该对象吗?

最佳答案

回答问题

Ember 内部使用 PromiseProxyMixin神奇地兑现我们所了解和喜爱的 promise 。这是使用 PromiseProxy 进行更新的 JSBin:

http://emberjs.jsbin.com/danazu/edit?html,js,output

您的结果属性变为:

results: Ember.computed.promise(function(resolve, reject) {
  Ember.$.getJSON('/search').then(function(res) {
    console.log('response data is: ', res);
    return resolve(res);
  });
})

但是我不推荐这样做。看看this discourse thread获取一些有关您可能不想这样做的原因的信息。简而言之,处理所有不同状态的 Promise 会很笨重。

寻找更好的方法

路由器是处理 AJAX 请求 promise 的完美场所。一定有某种原因导致您不只是在 modelafterModel Hook 中将这些数据加载到路由器中。您可以创建另一个嵌套资源来表示这些搜索结果,然后链接该资源吗?

在您的路由器中:

Router.map(function() {
  this.resource('search', { path: '/search/:term' });
});

App.PeopleRoute = Ember.Route.extend({
  model: function(params) {
    return Ember.$.getJSON('/search?term=' + params.term);
  }
});

如果这不起作用,至少你可以:

  1. 当您需要搜索结果时发送操作
  2. 在 Controller 中处理 AJAX 请求
  3. 解析后在 Controller 上设置结果

关于javascript - 使用返回的 promise 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26495947/

相关文章:

javascript - 如何给slideToggle添加延迟

javascript - 从 API 获取 ember 组件中的数据

Jquery Promise 以及何时不使用 Ajax

javascript - 如何 promise 这段 Mongoose 代码?

JavaScript - 只为多个请求运行一个 Promise

javascript - JQuery - 使 .slideToggle 特定于每个列表

javascript - foreach 单选按钮显示更多信息

javascript - 使用 HTML5 浏览器历史记录 API 在 SPA 中进行页面刷新?

ember.js - Ember 使用 OData

javascript - 是否可以将相对 URL 提供给 Phantom.js 页面生成器来获取 PDF 渲染?