Как вернуть значение переменной, которая объявлена ​​внутри Обещания - PullRequest
0 голосов
/ 07 июня 2019

Переменные, объявленные в 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 ]

1 голос
/ 07 июня 2019

Вы должны разрешить ваше обещание верхнего уровня с возвращаемым значением только тогда, когда ваша асинхронная операция завершена. В вашем коде вы делаете это до завершения асинхронной операции. Вызвать распознаватель сразу после заполнения массивов.

fetchResults.forEach(function (filtersForWorksheet) {

   ...
   ...

});

resolve([filternames, filtervalues]);
1 голос
/ 07 июня 2019

Вы должны иметь в виду, что Javascript является асинхронным, и, следовательно, ваш resolve([filternames, filtervalues]); будет вызван до того, как их значения будут обновлены в promise.all.

Согласно определению MDN для 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)

})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...