【问题标题】:How to return a variable's value which is declared inside of a Promise如何返回在 Promise 中声明的变量值
【发布时间】:2019-06-07 05:24:48
【问题描述】:

在 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)

})

目前,过滤器名称和过滤器值为空。我只想先处理数据,然后打印那些变量

【问题讨论】:

  • java != javascript
  • 在Promise.all()内尝试return

标签: javascript asynchronous promise


【解决方案1】:

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

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

在您的 filternames 和 filtervalues 更新后,将 resolve 调用移到您的 promis.all 中。

试试下面的代码:

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)

})

【讨论】:

    【解决方案2】:

    您应该仅在异步操作完成时使用返回值来解决您的顶级承诺。在您的代码中,您在异步操作完成之前执行此操作。填充数组后立即调用解析器。

    fetchResults.forEach(function (filtersForWorksheet) {
    
       ...
       ...
    
    });
    
    resolve([filternames, filtervalues]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多