我正在尝试在节点js中创建一个函数,该函数在for循环中读取数据库值并将它们推送到数组中,然后在最后返回此数组。 我的功能目前看起来像这样:
function loadTokens(userIds) {
var tokens = [];
userIds.forEach(item => {
admin.database().ref('/users/' + item).once('value').then(snapShot => {
var user = snapShot.val();
console.log('User', user.name);
console.log('token', user.fcmToken);
return tokens.push(user.fcmToken);
};
});
return tokens;
}
在代码的主要部分中,我想调用这个函数并使用.then来获取返回的数组并调用另一个以数组作为参数的函数。我想这样做是为了确保在作为参数传递时填充数组。
return loadTokens(userIds).then(tokens => {
console.log('tokens', tokens)
return admin.messaging().sendToDevice(tokens, payload);
});
我做了一些研究,并且我了解到我必须在我的函数中返回一个Promise,它以某种方式包含数组,因此可以在.then语句中使用它。
你能帮我解决一下如何在函数中返回一个promise以及如何在.then部分中访问数组?
答案 0 :(得分:1)
这样的事情可以解决问题:
function loadTokens(userIds) {
var promises = userIds.map(item => admin.database().ref('/users/' + item).once('value'));
return Promise.all(promises).then(snapshots => {
return snapshots.map(snapshot => snapshot.val().fcmToken);
});
}
因此我们使用Promise.all()
等待加载所有令牌,并从then
完成处理程序返回令牌。