如何从Javascript中的另一个函数访问对象

时间:2019-04-29 13:15:40

标签: javascript node.js object

我试图从数组中获取一些数据并将其存储在一个对象中,但是我一直在日志中获取一个空对象或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 个答案:

答案 0 :(得分:2)

控制台日志在解析异步方法/ Promise之前发生。您只应在那之后进行检查。换句话说,您的代码应类似于:

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

如果您不想在getNotifications()内调用它,只需获取它返回的Promise并在.then()(选项1)内执行您的呼叫,或执行await(选项2) )。在代码中:

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

一个链接,可进一步了解https://javascript.info/async关于该主题的信息。

答案 1 :(得分:0)

逐行解码程序

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。因此,您需要在then函数中调用getMessageData()

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

答案 2 :(得分:0)

您在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();

答案 3 :(得分:0)

您需要等待getNotifications函数完成,然后才能将结果记录到控制台。

getNotifications是异步的,这意味着它不会同步运行,并且以下代码行

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

getMessageData();

可能在您的getNotifications完成之前执行,因此您的getMessageData()调用不会打印所需的结果。

答案 4 :(得分:0)

第一:在这种情况下,全局变量messageData将成为fcmObjects中的最后一项。因此请确保为messageData中的fcmObjects.forEach( (notificationData) => { messageData = notificationData; }); 对象提供键或索引 第二: 当您调用Asynchronous操作时,您不会以这种方式记录该操作。

毕竟您的代码必须是这样的:

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);
});