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