我正在学习AngularJS并尝试使用Elasticsearch在一个简单的搜索应用程序中实现Angular UI Bootstrap Typeahead。我想使用$ http服务来加载异步结果,并且没有使用js promises。
更新:我已经做了更多的学习和测试
我已将Typeahead包含在我的应用中作为依赖项:
var searchApp = angular.module('searchApp', ['elasticsearch', 'ngSanitize', 'ui.bootstrap']);
这是js promise代码,其ES匹配查询映射到content.autocomplete字段:
this.getSuggestions = function(query) {
var deferred = $q.defer();
esClient.search({
index: 'bigtestindex',
body: {
"query": {
"match": {
"content.autocomplete": {
"query": query,
"operator": "and"
}
}
},
"suggest": {
"text": query,
"phraseSuggestion": {
"phrase": {
"field": "content",
"direct_generator": [{
"field": "content",
"suggest_mode": "popular",
"min_word_length": 3,
"prefix_length": 2
}]
}
}
},
"size": 5,
"_source": ["content.autocomplete"]
}
}).then(function(es_return) {
deferred.resolve(es_return);
}, function(error) {
deferred.reject(error);
});
return deferred.promise;
};
使用此代码,我试图实现如here
所示的异步结果以下是显示可能匹配项的相关html:
<li ng-repeat="gram in autocomplete.edgengrams">
<p ng-mousedown="searchForSuggestion()"><small>Search Suggestions: —</small>{{gram.content}}</p>
</li>
答案 0 :(得分:0)
$ http.get()已经返回一个promise对象,不需要将结果包装在另一个promise对象中。