我接受输入并在每个项目的描述中查找。服务中的控制台语句显示所需的输出,但ctrl中的promise是发生错误的位置。我错过了什么?
NarrowItDownController.$inject=['MenuSearchService'];
function NarrowItDownController(MenuSearchService) {
var ctrl = this;
ctrl.searchTerm = "";
ctrl.found=[];
ctrl.searchlist = function () {
if (ctrl.searchTerm.length > 0) {
console.log(ctrl.searchTerm);
var promise = MenuSearchService.getMatchedMenuItems(ctrl.searchTerm);
promise.then(function (result) {
ctrl.found = result;
}).catch(function (error) {
console.log("something went wrong!!!");
});
}
};
}
MenuSearchService.$inject = ['$http'];
function MenuSearchService($http) {
var service= this;
var found = [];
service.getMatchedMenuItems = function (searchTerm) {
var response = $http({
method: "GET",
url: ("https://davids-restaurant.herokuapp.com/menu_items.json")
}).then(function (response) {
for (var i = 0; i < response.data.menu_items.length; i++) {
if (response.data.menu_items[i]
.description.toLowerCase().indexOf(searchTerm)>-1 ) {
found.push(response.data.menu_items[i]);
}
}
console.log(found);
return found;
}, function() {
console.log('error');
});
};
}
}) ();
答案 0 :(得分:3)
您永远不会从函数getMatchedMenuItems
返回创建的承诺,因此调用promise.then(function (result)
将失败。在getMatchedMenuItems
中更改此行
var response = $http({...
到
return $http({...
解决方案是在整个堆栈中使用promises。让该服务函数返回承诺并让控制器调用then
,以便在解决承诺后它可以正常工作。
我很想将此标记为How do I return the response from an asynchronous call?的副本。我建议至少阅读它,这可以让你更好地了解如何使用promises。