过滤承诺Emberjs

时间:2015-04-25 03:14:20

标签: javascript ember.js ember-cli

我正在尝试创建来自JSON API的搜索。我已经看过一些教程如何做到这一点,我让它使用他们的例子:

export default Ember.ArrayController.extend({
    searchText: null,

    searchResults: function(){
            var searchText = this.get('searchText');

            if ( ! searchText)
            {
                return;
            }
            else
            {
                var regex = new RegExp(searchText, 'i');
                return ['hey', 'dude'].filter(function(c){
                    return c.match(regex);
                });
            }
        }.property('searchText')

});

这很有效但是当我尝试做同样的承诺时我迷路了:

export default Ember.ArrayController.extend({
    searchText: null,

    searchResults: function(){
            var searchText = this.get('searchText');
            var adapter = AddressBookAdapter.create();
            var companies =  adapter.findAll();

            if ( ! searchText)
            {
                return;
            }
            else
            {
                var regex = new RegExp(searchText, 'i');
                return companies.filter(function(c){
                    return c.match(regex);
                });
            }
        }.property('searchText')

});

这是适配器类:

export default Ember.Object.extend({
    findAll: function(){
        return ajax('http://localhost:8000/api/v1/address-book/companies')
            .then(function(response){
                return response.data;
            });
    }
});

这是JSON API响应结构的一个示例:

{
  data: [
    {
      id: 6,
      name: "Alexandrine Skiles",
      links: [
        {
          rel: "self",
          uri: "/api/v1/address-book/alexandrine-skiles"
        }
      ]
    },
    {
      id: 33,
      name: "Ally Johns",
      links: [
        {
          rel: "self",
          uri: "/api/v1/address-book/ally-johns"
        }
      ]
    }
  ]
}

我收到此错误:

Uncaught TypeError: companies.filter is not a function

我尝试找出一种方法将一个promise转换为一个数组,这样我就可以运行过滤器功能,但却什么都没有。实现我想做的事情的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

您无法将承诺“转换”为数组。承诺是承诺对象,可以在某个时刻履行(如果尚未履行)。他们可以异步返回结果。

所以当你有这条线时:

var companies = adapter.findAll();

companies变量是一个承诺,完成后将返回您的数据。换句话说,companies有一个.then()方法,你应该使用它。

所以你的ArrayController代码会变成这样:

export default Ember.ArrayController.extend({
    searchText: null,
    searchResults: [],

    searchResultUpdater: function(){
        var searchText = this.get('searchText');
        var adapter = AddressBookAdapter.create();
        var companies =  adapter.findAll();

        if ( ! searchText)
        {
            return;
        }
        else
        {
            var regex = new RegExp(searchText, 'i');
            companies.then(function(data) {
                var results = data.filter(function(c){
                    return c.match(regex);
                });
                this.set('searchResults', results);
            });
        }
    }.property('searchText')
});

在履行承诺时设置searchResults属性。当然,可能有更好的方法--Ember提供了很多工具。

如果您根本不打算使用结果,也可能需要在发出任何ajax请求之前执行if (!searchText)位;)