如何正确解析 bs-typeahead 的 javascript 承诺

Posted

技术标签:

【中文标题】如何正确解析 bs-typeahead 的 javascript 承诺【英文标题】:How to correctly resolve a javascript promise for a bs-typeahead 【发布时间】:2020-06-09 22:40:33 【问题描述】:

我工作的一个项目,开发一个datasource plugin for Grafana。这意味着,我坚持这似乎是一些AngularJS库/模块的合理的旧版本。该Grafana项目还seems to have pulled out the use of $q,并因此我试图找出如何使用原生对象的承诺在可能的(承诺也是东西我是新来的)。 P>

我有一个bs-typeahead form input这是正确调用以下承诺其返回结果: P>

getOptions(query) 
  console.log('Getting options')
  return this.datasource.metricFindQuery(query || '').then(a => 
    console.log(a);
    this.scope.$digest();
    return a
  );

然而,BS-预输入,下拉不会出现显示结果尽管示出预期结果的数组被记录到控制台。 P>

使用this.scope.$digest();的功能,我得到的$digest already in progress错误,所以现在我只能坚持在那里/我应该如何来调用$范围。$消化(),或者如果这是最好的办法。如果我删除了这一行我没有得到一个错误,但没有结果出现。 P>

我已经看到了在few 987654325 suggestions,试图得到这个工作,但都没有成功迄今。 P>

如果我换出getOptions return用于普通数组先行工作没有任何问题(例如['a','b','c']) - 所以我相信的问题是与无极 P>

好像$scope.$apply,could be an option,但同样我不知道它应该在代码库的情况下坐。 P>

我应该怎么做才能得到承诺,决心在适当的BS-预输入的光? P>

在整个javascript文件,上述功能驻留在可用here P>

我的眼前问题,如何在我的特定情况下的承诺(或多个)的决心将是确保我正确地理解概念有很大的帮助的解释除了协助。 P>

【问题讨论】:

如果getOptions()工作时,它返回阵列而不是在它返回无极,那么调用者不期望无极。在所有probabilty,你需要修改调用者。 SPAN> 【参考方案1】:

您的 typeahead 似乎无法处理 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;

【讨论】:

这似乎不起作用,可能与我在帖子中链接的原因相同(也在这里:***.com/questions/47427141/…)。如果我在返回之前 console.log() 结果变量,它会在 then() 承诺的 console.log() 之前 打印到控制台(请参阅dpaste.com/1WRBVQY),所以承诺不会'在函数返回之前似乎没有解析。 console.log 是正常的,因为 then 是异步调用的。除了 result 数组将在 promise 解决后更新。此外,根据文档 (mgcrea.github.io/angular-strap/#/typeaheads),您应该将属性“watchOptions”设置为 true

以上是关于如何正确解析 bs-typeahead 的 javascript 承诺的主要内容,如果未能解决你的问题,请参考以下文章

这是一个正确的 JSON 吗?我们如何解析它?

如何正确同步解析与本地数据存储?

如何以正确的方式解析来自 GET 响应的数据?

如何正确解析Java中的字节流

如何正确解析我的 Discord 机器人中的标记用户?

解析ThreadPoolExecutor类是如何保证线程池正确运行的