Как правильно разрешить обещание javascript для bs-typeahead - PullRequest
1 голос
/ 26 февраля 2020

Я работаю над проектом по разработке плагина источника данных для 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, который выполняет вышеуказанная функция проживает в, доступно здесь .

Помимо помощи в моем непосредственном вопросе, объяснение того, как решения Обещаний в моем конкретном контексте было бы большим подспорьем в том, чтобы убедиться, что я правильное понимание концепции.

1 Ответ

0 голосов
/ 26 февраля 2020

Кажется, что ваш типограф не может обработать Обещание.

Вам нужно будет вручную предоставить массив и обновить его после разрешения Обещания.

getOptions(query) {
  let result = [];
  console.log('Getting options')
  this.datasource.metricFindQuery(query || '').then(a => {
    console.log(a)
    a.forEach(item => result.push(item));
  });

  return result;
}
...