如何返回在Promise中声明的变量的值

时间:2019-06-07 05:24:48

标签: javascript asynchronous promise

首先返回在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)

})

当前,过滤器名称和过滤器值为空。我只希望先处理数据,然后打印这些变量

2 个答案:

答案 0 :(得分:1)

您需要记住,Javascript是异步的,因此您的resolve([filternames, filtervalues]);将在promise.all中更新其值之前被调用。

根据MDN's definition of Promise,您调用resolve函数的数据是该promise解析为的数据,因此无需返回任何内容。

promis.allfilternames更新后,在您的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]);