Проблема здесь в том, что вы пытаетесь сделать асинхронный оператор экспорта, что строго запрещено.
Прежде всего, да, 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
к вашему обещанию для обработки любых ошибок.Но у вас есть основная идея.
Никогда не делайте асинхронный экспорт , и если вам нужно это сделать, это означает, что вам нужно переосмыслить свой код!