我正在开发datasource plugin for Grafana的项目。这意味着我被某些AngularJS库/模块的合理的旧版本所困扰。 Grafana项目也seems to have pulled out the use of $q,因此,我试图找出如何在可能的情况下使用本机Promise对象(Promise也是我的新手)。

我有一个bs-typeahead form input,它正确调用了以下返回结果的promise:

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()的方式,或者这是否是最好的方法。如果删除该行,则不会出现错误,但不会出现任何结果。

我看过few different suggestions尝试使它起作用,但是到目前为止还没有成功。

如果我将getOptions return换成一个普通数组(例如['a','b','c']),则超前工作没有任何问题-因此,我有信心Promise会出现问题。

看起来像$scope.$applycould be an option,但是同样我不确定在代码库的上下文中它应该位于哪里。

我应该怎么做才能根据bs-typeahead做出适当解决的承诺?

上述功能所驻留的整个Javascript文件可用here

除了对我眼前的问题提供帮助之外,对Promise(s)在我的特定情况下如何解决的解释将对确保我正确理解概念有很大帮助。

最佳答案

您的提前输入似乎无法处理Promise。

解决Promise后,您将必须手动提供一个数组并更新它。

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;
}

关于javascript - 如何正确解决bs-typeahead的JavaScript promise ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60407456/

10-17 03:14