Javascript 如何返回变量';在承诺中声明的s值

Javascript 如何返回变量';在承诺中声明的s值,javascript,asynchronous,promise,Javascript,Asynchronous,Promise,先返回承诺中声明的变量,然后执行函数 我有下面的一段代码,它首先获取一些过滤器值并将它们推送到FilterFetch中。获取过滤器本身的函数是一个异步函数。然后我在FilterFetch中处理数据,然后我必须返回处理后的数据。用于存储已处理数据的变量在getfilters()函数中声明,因为我需要在每次迭代后将它们设置为空 目前,当我打印出过滤器名称、过滤器值时,它们只是显示为空。如何首先处理来自filterFetchPromises的数据,然后返回这些值 function getfilters

先返回承诺中声明的变量,然后执行函数

我有下面的一段代码,它首先获取一些过滤器值并将它们推送到FilterFetch中。获取过滤器本身的函数是一个异步函数。然后我在FilterFetch中处理数据,然后我必须返回处理后的数据。用于存储已处理数据的变量在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)

})

当前,筛选器名称和筛选器值为空。我只想先处理数据,然后打印这些变量,你需要记住Javascript是异步的,因此你的
解析([filtername,filtervalues])promise.all中更新其值之前,将调用code>

根据,调用resolve函数所用的数据就是这个承诺解析到的数据,因此不需要返回任何东西

将resolve调用移动到您的
promis中。更新
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)

})

只有在异步操作完成时,才应使用返回值解析顶级承诺。在代码中,您是在异步操作完成之前完成的。填充数组后立即调用解析器

fetchResults.forEach(function (filtersForWorksheet) {

   ...
   ...

});

resolve([filternames, filtervalues]);

爪哇!=javascriptTry
return
inside
Promise.all()