这是一个很老的问题,所以我不确定 OP 是否仍然需要答案,但我假设这是 OP 使用异步 JavaScript 调用后端并且不能因此,只需返回结果。
我们的应用程序(尽管使用 nodejs 后端)中的情况并没有什么不同,我们根据从 Google Cloud Datastore 检索到的选项填充下拉列表。我们有一个 React App,所以我们的解决方案是在窗口上附加一个 Flux 存储,我们的异步调用在完成时填充该存储,然后让下拉生成代码访问该存储。显然,一个完整的 Flux 存储可能并不适合所有情况,但我在这里的一般建议是传入一个选项生成器函数并让它从窗口上的存储或其他变量中读取,然后调用后端在页面加载时运行(或在其他情况下)并在窗口上填充存储。如果您的应用程序在调用完成之前启动,您可以设置它以显示它正在加载基于商店上的标志的选项。
作为一个非常简化的案例,您可能有:
// on page load
window.store = {done: false};
myBackendCall()
.then(function(results){
window.store = {
results: results,
done: true
};
})
.catch(function(error){
console.error(error);
window.store = {results: [], done: true};
});
然后在您的选择器中,您可能会使用以下内容:
function generateOptions(){
if(!window.store.done) {
return [['Loading...', 'loading']];
} else {
return [['Select a file', '']].concat(window.store.results);
}
}
this.appendDummyInput()
.appendField(new Blockly.FieldDropdown(generateOptions), fieldName);
显然,这是一个粗略的简化,但我认为这足以展示这项技术。实际上,出于其他原因,我们创建了自己的自定义 Blockly 字段,但这仍然适用于普通的 Blockly 下拉菜单。如果您的设置是这样,则将 Promise 链换成回调。您也可以在块内进行调用并在块本身(this.store
或其他)上设置一个变量,但这会导致对块的多个实例进行多次调用,因此这可能不适合您。