如何正确解析 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 承诺的主要内容,如果未能解决你的问题,请参考以下文章