Как получить доступ к объекту из другой функции в Javascript - PullRequest
2 голосов
/ 29 апреля 2019

Я пытаюсь получить некоторые данные из массива и сохранить их в объекте, но я получаю либо пустой объект, либо Promise { <pending> } в журналах. Я использую переменную global для хранения и доступа к ней в другой функции. Не уверен, что я делаю не так.

var messageData = {};

const getNotifications =  async () => {
    let fcmObjects = await fcmTokens();
    fcmObjects.forEach( (notificationData) => {
        messageData = notificationData;
    });
};

function getMessageData() {
    console.log(messageData);
}

getMessageData();

getNotifications().then(function () {
    console.log('All Done');
}).catch(function (error) {
    console.log('Oops', error);
});

Ответы [ 5 ]

2 голосов
/ 29 апреля 2019

Журнал консоли происходит до разрешения асинхронного метода / Promise. Вы должны проверить это только после этого. Другими словами, ваш код должен быть похож на:

getNotifications().then(function () {
    getMessageData();
    console.log('All Done');
}).catch(function (error) {
    console.log('Oops', error);
});

Если вы не хотите вызывать его внутри getNotifications(), просто получите обещание, которое он возвращает, и выполните ваш вызов внутри .then() (вариант 1) или выполните await (вариант 2). В коде:

const notificationPromise = getNotifications();
// option 1
notificationPromise.then(getMessageData);
// option 2
await notificationPromise;
getMessageData();

Ссылка, чтобы узнать больше https://javascript.info/async о теме.

0 голосов
/ 29 апреля 2019

Первый: ваша глобальная переменная messageData будет последним элементом в fcmObjects в этом сценарии. поэтому убедитесь, что вы указали ключ или индекс для messageData объекта в fcmObjects.forEach( (notificationData) => { messageData = notificationData; }); Во-вторых: когда вы вызываете асинхронную операцию, вы не будете регистрировать ее таким образом.

Ведь ваш код должен быть таким:

var messageData = {};

const getNotifications =  async () => {
    let fcmObjects = await fcmTokens();
    fcmObjects.forEach( (index, notificationData) => {
        messageData[index] = notificationData;
    });
};

function getMessageData() {
    console.log(messageData);
}

getNotifications().then(function () {
    getMessageData();
    console.log('All Done');
}).catch(function (error) {
    console.log('Oops', error);
});
0 голосов
/ 29 апреля 2019

Вам нужно дождаться завершения функции getNotifications, прежде чем вы сможете зарегистрировать ее результат на консоли.

getNotifications является асинхронным, что означает, что он не будет работать синхронно, и следующие строки кода

function getMessageData() {
    console.log(messageData);
}

getMessageData();

может быть выполнено до завершения ваших getNotifications, поэтому ваш вызов getMessageData () не выводит желаемый результат.

0 голосов
/ 29 апреля 2019

Вы выполняете getMessageData до getNotifications. Вы можете использовать асинхронный / ожидающий подход

try {
  await getNotifications();
  getMessageData();
  console.log('All Done');
} catch (error) {
  console.log('Oops', error);
}

var messageData = [];

const getNotifications = async() => {
  //let fcmObjects = await fcmTokens();
  //fcmObjects.forEach((notificationData) => {
  //  messageData = notificationData;
  //});
  
  // simulate commentet above code
  return new Promise((resolve,reject)=>{ messageData=['someMessage']; resolve()})
};

function getMessageData() {
    console.log(messageData);
}

async function run() {
  try {
    await getNotifications();
    getMessageData();
    console.log('All Done');
  } catch (error) {
    console.log('Oops', error);
  }
}

run();
0 голосов
/ 29 апреля 2019

Декодирование вашей программы построчно

var messageData = {};

- это объект

const getNotifications =  async () => {
    let fcmObjects = await fcmTokens();
    fcmObjects.forEach( (notificationData) => {
        messageData = notificationData;
    });
};

getNotifications - это асинхронная функция.

function getMessageData() {
    console.log(messageData);
}

getMessageDataпечатает все данные сообщения.

getMessageData(); 

вы напечатали данные сообщения, которые {}.Помните, что getNotfications никогда не вызывается до сих пор, поскольку строки выполняются одна за другой.

getNotifications().then(function () {
    console.log('All Done');
}).catch(function (error) {
    console.log('Oops', error);
});

Теперь приведенный выше код вызывает getNotification и запускает function, предоставленный в then при асинхронном вызове.выполнен.Поэтому вам нужно вызвать getMessageData() в функции затем.

getNotifications().then(function () {
    getMessageData();
    console.log('All Done');
}).catch(function (error) {
    console.log('Oops', error);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...