我开始学习JS并且陷入了一些非常简单的事情。我在互联网和SE上搜索但找不到答案。
我有简单的按钮:
<button onClick="filtersearchWrapper()">look for filter</button>
运行:
function filtersearchWrapper()
{
filtersearch();
}
和filtersearch()
是:
function filtersearch() {
found = 0;
for (i = 0; i < worksheetArray.length; i++) {
filters = worksheetArray[i].getFiltersAsync().then(
function(filtersArrayReturnedInPromise) {
for (filter of filtersArrayReturnedInPromise) {
if (found == 1) {
break;
}
else
{
if (filter.getFilterType() == "quantitative" && filter.getFieldName().includes("[AutoFilter]")) {
console.log("aa" + filter.getFieldName());
found = 1;
filtername = filter.getFieldName();
}
}
}
})
}
return filtername;
}
该函数执行异步调用(getFiltersAsync
)并返回一个解析为数组的promise。然后我遍历这个数组并查找我想要返回并在下一个函数中使用的特定条目。
最深层次的console log
工作正常,但整个filtersearch()
函数不会向包装函数返回任何内容。
我相信这是由于函数中没有返回值直到函数结束,但我不知道如何传递它们。我该如何处理?
更新
对于那些在这里闲逛的人来说,这就是我如何使用描述中的文章解决问题。 事实证明,当你开始使用异步功能时,很可能你必须记住它直到脚本结束。
在filterseach()
中,在循环之前只添加了一个小变化return
:
function filtersearch()
{
viz = getCurrentViz();
sheet=viz.getWorkbook().getActiveSheet();
worksheetArray = sheet.getWorksheets();
worksheets = sheet.getWorksheets();
found=0;
for (i=0;i<worksheetArray.length;i++){
return filters=worksheetArray[i].getFiltersAsync().then(
function(filtersArrayReturnedInPromise){
for ( var filter = 0, len = filtersArrayReturnedInPromise.length; filter < len; ++filter )
{
if (found ==1) {
break;
}else{
if (filtersArrayReturnedInPromise[filter].getFilterType()=="quantitative" && filtersArrayReturnedInPromise[filter].getFieldName().search("AutoFilter")>0)
{
found = 1;
filtername = filtersArrayReturnedInPromise[filter].getFieldName();
return filtername;
}
}
}
});
}
}
但主要的变化是在filtersearchWrapper()
中完成的(事实上它已被删除并在以后的主函数中集成):
function filtersearchWrapper(){
filtersearch().then(function(filter_found){
//do some code here after filters are discovered
});
}