Я работаю над проектом по разработке плагина источника данных для Grafana . Это означает, что я застрял с тем, что кажется довольно старыми версиями некоторых из AngularJS библиотек / модулей. Проект Grafana также , похоже, отказался от использования $q
, и в результате я пытаюсь понять, как использовать нативные объекты Promise, где это возможно (Обещания - это тоже что-то новое to).
У меня есть ввод формы bs-typeahead , который правильно вызывает следующее обещание, которое возвращает результаты:
getOptions(query) {
console.log('Getting options')
return this.datasource.metricFindQuery(query || '').then(a => {
console.log(a);
this.scope.$digest();
return a
});
}
Однако bs- раскрывающийся список typeahead не отображает результаты, несмотря на массив, показывающий ожидаемые результаты, записываемые на консоль.
С this.scope.$digest();
в функции я получаю ошибку $digest already in progress
, и теперь Я застрял с тем, где / как я должен вызывать $ scope. $ Digest (), или, если это лучший подход. Если я удаляю эту строку, я не получаю сообщение об ошибке, но результаты не отображаются.
Я рассмотрел несколько различных предложений , чтобы попытаться заставить это работать, но пока не удалось.
Если я поменяю getOptions return
для простого массива (например, ['a','b','c']
), прогноз работает без каких-либо проблем - так что я уверен, что проблема в Обещании.
Кажется, что $scope.$apply
, может быть вариантом , но, опять же, я не уверен, где он должен сидеть в контексте кодовой базы.
Что я должен сделать, чтобы получить обещание разрешить должным образом в свете bs-typeahead?
Весь файл Javascript, который выполняет вышеуказанная функция проживает в, доступно здесь .
Помимо помощи в моем непосредственном вопросе, объяснение того, как решения Обещаний в моем конкретном контексте было бы большим подспорьем в том, чтобы убедиться, что я правильное понимание концепции.