首先返回在Promise中声明的变量,然后执行该函数
我有以下一段代码,该代码首先获取一些过滤器值并将其推入filterFetchPromises中。本身获取过滤器的功能是异步功能。然后,我在filterFetchPromises中处理数据,然后必须返回处理后的数据。用于存储处理的数据的变量在getfilters()函数中声明,因为我需要在每次迭代后将它们设置为空。
当前,当我打印出过滤器名称,过滤器值时,它们只是显示为空。如何首先处理来自filterFetchPromises的数据,然后返回这些值?
function getfilters() {
return new Promise(function(resolve) {
let filterFetchPromises = [];
let dashboardfilters = [];
let filternames = [];
let filtervalues = [];
filterFetchPromises.push(worksheet.getFiltersAsync());
Promise.all(filterFetchPromises).then(function (fetchResults) {
fetchResults.forEach(function (filtersForWorksheet) {
filtersForWorksheet.forEach(function (filter) {
dashboardfilters.push(filter);
if (contains(filternames, filter.fieldName)) {
console.log("Duplicate Entry")
}
else {
let filtervalues_temp = []
console.log(filter.fieldName)
if ((filter.appliedValues).length > 0) {
filternames.push(filter.fieldName)
console.log(filter.fieldName)
filter.appliedValues.forEach(function(test) {
console.log(test.value)
filtervalues_temp.push(test.value)
})
filtervalues.push(filtervalues_temp)
}
}
});
});
});
// console.log(filternames)
// console.log(filtervalues)
return resolve([filternames, filtervalues]);
})
}
getfilters().then(function ([filternames, filtervalues]) {
console.log("Function got over.")
console.log(filternames)
console.log(filtervalues)
})
当前,过滤器名称和过滤器值为空。我只希望先处理数据,然后打印这些变量
答案 0 :(得分:1)
您需要记住,Javascript是异步的,因此您的resolve([filternames, filtervalues]);
将在promise.all
中更新其值之前被调用。
根据MDN's definition of Promise,您调用resolve函数的数据是该promise解析为的数据,因此无需返回任何内容。
在promis.all
和filternames
更新后,在您的filtervalues
内部移动解决方案调用。
尝试以下代码:
function getfilters() {
return new Promise(function(resolve) {
let filterFetchPromises = [];
let dashboardfilters = [];
let filternames = [];
let filtervalues = [];
filterFetchPromises.push(worksheet.getFiltersAsync());
Promise.all(filterFetchPromises).then(function (fetchResults) {
fetchResults.forEach(function (filtersForWorksheet) {
filtersForWorksheet.forEach(function (filter) {
dashboardfilters.push(filter);
if (contains(filternames, filter.fieldName)) {
console.log("Duplicate Entry")
}
else {
let filtervalues_temp = []
console.log(filter.fieldName)
if ((filter.appliedValues).length > 0) {
filternames.push(filter.fieldName)
console.log(filter.fieldName)
filter.appliedValues.forEach(function(test) {
console.log(test.value)
filtervalues_temp.push(test.value)
})
filtervalues.push(filtervalues_temp)
}
}
});
resolve([filternames, filtervalues]);
});
});
// console.log(filternames)
// console.log(filtervalues)
})
}
getfilters().then(function ([filternames, filtervalues]) {
console.log("Function got over.")
console.log(filternames)
console.log(filtervalues)
})
答案 1 :(得分:1)
只有在异步操作完成后,才应使用返回值来解决顶级承诺。在代码中,您是在异步操作完成之前执行此操作的。填充阵列后立即调用解析器。
fetchResults.forEach(function (filtersForWorksheet) {
...
...
});
resolve([filternames, filtervalues]);