【发布时间】:2021-02-26 02:01:26
【问题描述】:
我对使用 Promise 还很陌生,现在我陷入了困境。我阅读了一些文章和 SO 帖子,但我无法理解它。
我有一个简单的 API,它返回一组人员和一些属性,如名字、姓氏和 d.o.b。我想在接下来的 10 天内检查生日。现在我被返回一个承诺的函数所困扰。我希望 API 返回一个数组,其中包含一个用于人员的数组和一个用于 nextBirthdays 的数组。
如何解决承诺?
(我知道计算日期的部分不是最优雅的方法)
router.get('/', async(req, res) => {
try {
const contacts = await Contact.find()
// Returns promise, but want array
const nextBirthdays = getNextBirthdays(contacts)
var promise = Promise.resolve(nextBirthdays);
promise.then(function(val) {
console.log(val);
});
res.json({ contacts, nextBirthdays })
} catch (error) {
res.status(500).json({ message: error.message })
}
})
async function getNextBirthdays(contacts) {
contacts.forEach(async(contact) => {
let daysTillBirthday = await getDaysTillBirthday(contact.dob)
if (daysTillBirthday < 10 && daysTillBirthday > 0) {
console.log(`${contact.firstname}'s birthday is in ${daysTillBirthday} days`)
nextBirthdays.push({
firstname: contact.firstname,
days: daysTillBirthday
})
}
// Returns object with next birthdays
return nextBirthdays
})
}
async function getDaysTillBirthday(_birthday) {
const birthday = await birthdayDayOfYear(_birthday)
const today = await dayOfTheYear()
const days = birthday - today
return await days;
}
async function birthdayDayOfYear(date) {
const now = date;
const start = new Date(now.getFullYear(), 0, 0);
const diff = now - start;
const oneDay = 1000 * 60 * 60 * 24;
const day = Math.floor(diff / oneDay);
return await day
}
async function dayOfTheYear() {
const now = new Date();
const start = new Date(now.getFullYear(), 0, 0);
const diff = now - start;
const oneDay = 1000 * 60 * 60 * 24;
const day = Math.floor(diff / oneDay);
return await day
}
【问题讨论】:
-
看起来你的任何函数都不需要异步。
-
await在forEach中不起作用 -
你的
getNextBirthdays实际上并没有返回任何东西,因为forEach总是返回undefined。 -
@DanCantir,它有效,只是没有按照您的想法做。
-
@DannisFink 观看此视频:youtube.com/watch?v=8aGhZQkoFbQ
标签: javascript node.js async-await promise es6-promise