如何正确解析bs typeahead的javascript承诺
我正在做一个项目来开发一个。这意味着我一直在使用一些AngularJS库/模块的老版本。Grafana项目也是如此,因此我正在努力研究如何尽可能使用本机承诺对象(承诺也是我的新手) 我得到了一个正确调用以下承诺的函数,该函数返回结果:如何正确解析bs typeahead的javascript承诺,javascript,angularjs,promise,grafana,Javascript,Angularjs,Promise,Grafana,我正在做一个项目来开发一个。这意味着我一直在使用一些AngularJS库/模块的老版本。Grafana项目也是如此,因此我正在努力研究如何尽可能使用本机承诺对象(承诺也是我的新手) 我得到了一个正确调用以下承诺的函数,该函数返回结果: getOptions(query) { console.log('Getting options') return this.datasource.metricFindQuery(query || '').then(a => { consol
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已在进行中
,因此现在我一直在思考应该在哪里/如何调用$scope.$digest(),或者这是否是最好的方法。如果删除该行,则不会出现错误,但不会显示任何结果
我已经看了一看,试图让这个工作,但迄今为止还没有任何成功
如果我将getOptionsreturn
替换为普通数组(例如['a'、'b'、'c']
),则前瞻功能不会出现任何问题,因此我相信问题在于承诺
它看起来像是$scope.$apply
,但我还是不确定它在代码库上下文中应该放在哪里
我应该做些什么才能得到承诺,根据未来的情况适当解决问题
上述函数所在的整个Javascript文件都可用
除了帮助我解决眼前的问题外,解释承诺在我的特定环境下如何解决,将有助于确保我正确理解这个概念。您的typeahead似乎无法处理承诺 您必须手动提供一个数组,并在承诺得到解决后进行更新
getOptions(查询){
让结果=[];
console.log('获取选项')
this.datasource.metricFindQuery(查询| |“”)。然后(a=>{
控制台日志(a)
a、 forEach(item=>result.push(item));
});
返回结果;
}
您的typeahead似乎无法处理承诺
您必须手动提供一个数组,并在承诺得到解决后进行更新
getOptions(查询){
让结果=[];
console.log('获取选项')
this.datasource.metricFindQuery(查询| |“”)。然后(a=>{
控制台日志(a)
a、 forEach(item=>result.push(item));
});
返回结果;
}
如果getOptions()
在返回数组时起作用,但在返回承诺时不起作用,则调用方不期望承诺。很可能,您需要修改调用者。如果getOptions()
在返回数组时有效,但在返回承诺时无效,则调用者不期望承诺。很可能,您需要修改调用者。这似乎不起作用,大概是因为我在我的帖子中链接到的相同原因(也在这里:)。如果我在返回前将console.log()作为结果变量,那么它将在then()承诺的console.log()之前打印到控制台(请参阅),因此在函数返回之前,承诺似乎没有解析。console.log
是正常的,因为then是异步调用的。但是一旦承诺得到解决,结果
数组将被更新。此外,根据文档(),您应该在trueThis上设置属性“watchOptions”,这似乎不起作用,大概是因为我在文章中链接到的相同原因(也在这里:)。如果我在返回前将console.log()作为结果变量,那么它将在then()承诺的console.log()之前打印到控制台(请参阅),因此在函数返回之前,承诺似乎没有解析。console.log
是正常的,因为then是异步调用的。但是一旦承诺得到解决,结果
数组将被更新。此外,根据文档(),您应该将属性“watchOptions”设置为true