Я создал проект, чтобы вернуть значение app.js без необходимости обработки обещания. Этот код возвращает undefined при запуске. Какие-нибудь советы?
export.js '
const admin = require('firebase-admin')
const db = admin.firestore();
const ref = db.collection('Things')
async function getNameV(ting) {
return await ref.get().then(doc => {
doc.forEach(documentSnapshot => {
var data = documentSnapshot.data()
if (ting == data.name || ting == data.id) {
return data.name
}
})
})
};
module.exports.getName = function(ting) {
getNameV(ting).then(value =>{
console.log(value)
return value;
})
};
app.js
const exp = require('./export.js')
var name = await exp.getName('foo')
console.log(name)
Вы должны вернуть обещание, созданное в вашей функции module.exports.getName
, например:
module.exports.getName = function(ting) {
return getNameV(ting).then(value =>{
console.log(value)
return value;
});
};
Затем, на стороне app.js
, вы должны убедиться, что вы вызываете экспортированную функцию из функции async
(иначе вы не сможете ее вызвать, используя await
):
const exp = require('./export.js')
async function start() {
var name = await exp.getName('foo')
console.log(name);
}
start();
Хьюго прав, но у вас есть еще одна ошибка в дополнение к этому. getNameV
даже не возвращает обещание, которое дает ценность, которую вы ищете. return data.name
на самом деле просто возвращается из анонимной функции, переданной в forEach(). Это значение не превращает это в обещание, которое вы вернетесь из getNameV
. Прямо сейчас, это буквально просто возвращает обещание, которое содержит неопределенные прямо сейчас.
Кроме того, return await [promise]
здесь избыточно. Вы можете просто return [promise]
, и даже не обе метки getNameV
с async
.
.then
когда у вас естьasync/await
?