From 4d59a611e30a6c3d27c4089bc1d1adb27ec3cc6b Mon Sep 17 00:00:00 2001 From: Thomas Burleson Date: Thu, 4 Feb 2016 16:55:25 -0600 Subject: [PATCH] fix(autocomplete): improve promise logic Thx @winniehell. Closes #6521. --- .../autocomplete/js/autocompleteController.js | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/components/autocomplete/js/autocompleteController.js b/src/components/autocomplete/js/autocompleteController.js index 33749d23cc0..0efaa9d03af 100644 --- a/src/components/autocomplete/js/autocompleteController.js +++ b/src/components/autocomplete/js/autocompleteController.js @@ -634,21 +634,29 @@ function MdAutocompleteCtrl ($scope, $element, $mdUtil, $mdConstant, $mdTheming, */ function fetchResults (searchText) { var items = $scope.$parent.$eval(itemExpr), - term = searchText.toLowerCase(); - if (angular.isArray(items)) { - handleResults(items); - } else if (items) { + term = searchText.toLowerCase(), + isList = angular.isArray(items); + + if ( isList ) handleResults(items); + else handleAsyncResults(items); + + function handleAsyncResults(items) { + if ( !items ) return; + + items = $q.when(items); setLoading(true); promiseFetch = true; + $mdUtil.nextTick(function () { - if (items.success) items.success(handleResults); - if (items.then) items.then(handleResults); - if (items.finally) items.finally(function () { - setLoading(false); - promiseFetch = false; - }); + items + .then(handleResults) + .finally(function(){ + setLoading(false); + promiseFetch = false; + }); },true, $scope); } + function handleResults (matches) { cache[ term ] = matches; if ((searchText || '') !== ($scope.searchText || '')) return; //-- just cache the results if old request