首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对承诺的过滤

对承诺的过滤
EN

Stack Overflow用户
提问于 2015-04-25 03:14:19
回答 1查看 743关注 0票数 2

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

代码语言:javascript
复制
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')

});

然而,当我试图用我迷失的承诺来做同样的事情时,这是很好的:

代码语言:javascript
复制
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')

});

下面是适配器类:

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

下面是JSON响应结构的一个示例:

代码语言:javascript
复制
{
  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"
        }
      ]
    }
  ]
}

我知道这个错误:

代码语言:javascript
复制
Uncaught TypeError: companies.filter is not a function

我试着想出一种将承诺转换为数组的方法,这样我就可以运行过滤器函数,但什么也没有得到。怎样才能达到我想要做的事情呢?

EN

回答 1

Stack Overflow用户

发布于 2015-04-25 05:12:14

你不能把承诺“转换”成数组。承诺是一个承诺对象,可能会在某一时刻实现(如果还没有实现的话)。它们可以异步返回结果。

所以当你有了台词:

代码语言:javascript
复制
var companies = adapter.findAll();

companies变量承诺,在实现时将返回您的数据。换句话说,companies有一个应该使用的.then()方法。

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

代码语言:javascript
复制
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)位;)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29860575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档