Я не могу получить данные из query.find (). Затем (функция (результаты), кажется, это просто локальный - PullRequest
0 голосов
/ 10 июля 2019

Я не могу получить flatListData, потому что он кажется локальным Я могу получить данные flatList только внутри query.find (). Then (function (results) А кроме этого я получил None!

Я пробую это с Async / Await, но не работает

const W = Parse.Object.extend("W");
const query = new Parse.Query(W);
var flatListData = [];

query.find().then(function(results) {
for (var i=0; i < results.length; i++){
flatListData.push(String(results[i].get("AlphabetCode")));
}

  alert(flatListData) //{"a" , "b" , "s" , "w"}

 });

 alert(flatListData) // Nothing! 
module.exports = flatListData;

1 Ответ

1 голос
/ 10 июля 2019

Проблема здесь в том, что вы пытаетесь сделать асинхронный оператор экспорта, что строго запрещено.

Прежде всего, да, flatListData является глобальным, а не локально ограниченным ,Фактическая проблема, с которой вы сталкиваетесь, заключается в том, что, хотя результат вашего запроса эффективно передается в вашу переменную, выполнение асинхронной функции занимает некоторое время.Когда вы вызываете вашу переменную во втором alert() и в module.exports, ваш асинхронный запрос еще не завершен, поэтому новое значение не присваивается, и в итоге вы отправляете только внешнее значение, кроме undefined..

Теперь единственный возможный способ справиться с этим - заставить module.exports ждать назначения переменной, что означает либо определение области действия внутри вашего обещания (вместе с вашим первым alert()),или используя оператор await.НО:

Документация MDN

Оператор ожидания используется для ожидания Обещания. Он может использоваться только внутри асинхронной функции .

Так оно и есть.Ваш единственный выходной путь - охватить module.exports… Что полностью запрещено.Вы никогда не хотите называть свой экспорт отдельно от верхнего уровня, или глобальной области действия.

Переопределить проблему

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

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

Теперь решение

getFlatListData.jsили как вы его называли

// Those are globally scoped. They will only be calculated on
// initialization, and not during outside import calls
const W = Parse.Object.extend("W");
const query = new Parse.Query(W);

// We wrap everything inside an async function, which will be exported
function getFlatListData() {
  // We return a promise, to allow outer calls to the result
  return new Promise(resolve => {
    // Also, avoid var. If you need a variable which isn’t constant, prefer let.
    let flatListData = [];

    // Prefer arrow functions here
    query.find().then(results => {
      // Works like your classic for(…) loop, but more efficient
      for(const result of results) {
        flatListData.push(String(result.get("AlphabetCode")));
      }

      // Resolve your function and send the result back
      resolve(flatListData);
    });
  });
}

module.exports = getFlatListData;

А теперь, в вашем внешнем скрипте:

main.js, или как угодно

// Assuming you are using commonJS syntax
const getFlatListData = require(‘path_to_your_script/getFlatListData’);

[. . .]

getFlatListData().then(result => {
  // Now you can use your FlatListData aliased as result
});

// OR

const myAsyncFunction = async() => {
  const myVariable = await getFlatListData();

  // Use myVariable as you please now
};

Здесь можно сделать много улучшений, например, с помощью функции map(), чтобы назначить flatListData, или добавить reject к вашему обещанию для обработки любых ошибок.Но у вас есть основная идея.

Никогда не делайте асинхронный экспорт , и если вам нужно это сделать, это означает, что вам нужно переосмыслить свой код!

...