Здесь есть пример в MDN,
const colors = fetch("../data/colors.json").then((response) => response.json());
export default await colors;
Однако у меня есть несколько констант, которые заполняются асинхронно в одной функции:
const _receiversById = {};
const _receiversByServer = {};
const _sequenceReceivers = {}; // name - k-v receivers
const _sequences = {};
// init
async function _fetchAllReceivers(){
// go to the database and copy data into those consts. multiple awaits.
}
Я озадачен, как мне сделать константы обещаниями, которые выполняются во время работы функции.
Я пытался назначить константы объектам обещаний без параметров.
const _receiversById = new Promise();
const _receiversByServer = new Promise();
const _sequenceReceivers = new Promise();
const _sequences = new Promise();
подумываю вызвать .resolve(_receivers...)
внутри функции _fetch..
здесь и там, но я очень сомневаюсь, что это сработает и его будет легко отладить.
Каким будет правильный/элегантный способ добиться этого?
«У меня есть несколько констант, которые асинхронно заполняются в одной функции» — даже если они не были константами, не делайте этого. Заставьте асинхронную функцию возвращать значение или несколько значений. Не изменяйте вещи асинхронно, даже если вы предположительно ждете чего-то, прежде чем использовать их.
«как мне сделать константы промисами, которые выполняются во время работы функции»., «Я пытался присвоить объекты промисов […] думая [позже] вызвать .resolve(_receivers...)
» — это не то, как промисы работают . Возможно, вы захотите взглянуть на Обещания для обещаний, которые еще предстоит создать, даже если они еще не используются await
Спроектируйте _fetchAllReceivers
так, чтобы он возвращал четыре объекта, которые вы заполнили асинхронно. Другими словами, сделайте обещание, возвращаемое _fetchAllReceivers()
, разрешающим четырем объектам (вложенным внутри объекта-оболочки).
async function _fetchAllReceivers(){
// Make these constants local to the async function
const receiversById = {};
const receiversByServer = {};
const sequenceReceivers = {}; // name - k-v receivers
const sequences = {};
// go to the database and copy data into those consts. multiple awaits.
// ...
// Return (i.e. resolve with) an object that has all the gathered data
return {
receiversById,
receiversByServer,
sequenceReceivers,
sequences
};
}
export const {
receiversById,
receiversByServer,
sequenceReceivers,
sequences
} = await _fetchAllReceivers();
На стороне импорта вы можете сделать:
import * as obj from './mymodule.mjs';
console.info(obj.receiversById);
Или:
import {
receiversById,
receiversByServer,
sequenceReceivers,
sequences
} from './mymodule.mjs';
console.info(receiversById);
Выглядит многообещающе! (во всех смыслах). Будет ли он экспортировать эти 4 объекта под их соответствующими именами?
Должно сработать. См. пример, который я добавил в конце.
Вместо этого вы можете захотеть export const { receiversById, receiversByServer, sequenceReceivers, sequences } = await _fetchAllReceivers();
. Избегайте экспорта объектов по умолчанию. Используйте import * as obj from '…'
на стороне импорта, если вы хотите использовать пространство имен.
Хорошо, @Bergi интегрировал эти предложения. Спасибо!
Да, это то, что я искал, выглядит круто, спасибо!
Вернуть обещание.все?