如何在javascript中从promise返回值?
我对承诺是相当陌生的,现在我被卡住了。我读了几篇文章和一些帖子,但我无法理解 我有一个简单的API,它返回一组人和一些属性,如firstname、lastname和d.o.b。我想在接下来的10天内检查生日。现在我被返回承诺的函数卡住了。我希望API返回一个数组,其中包含一个用于人的数组和一个用于下一个星期的数组 我如何解决承诺 (我知道计算日期的部分不是最优雅的方式)如何在javascript中从promise返回值?,javascript,node.js,async-await,promise,es6-promise,Javascript,Node.js,Async Await,Promise,Es6 Promise,我对承诺是相当陌生的,现在我被卡住了。我读了几篇文章和一些帖子,但我无法理解 我有一个简单的API,它返回一组人和一些属性,如firstname、lastname和d.o.b。我想在接下来的10天内检查生日。现在我被返回承诺的函数卡住了。我希望API返回一个数组,其中包含一个用于人的数组和一个用于下一个星期的数组 我如何解决承诺 (我知道计算日期的部分不是最优雅的方式) router.get('/',async(req,res)=>{ 试一试{ const contacts=wait Conta
router.get('/',async(req,res)=>{
试一试{
const contacts=wait Contact.find()
//返回承诺,但需要数组
const nextBirthdays=getNextBirthdays(联系人)
var promise=promise.resolve(下一个星期);
承诺。然后(功能(val){
控制台日志(val);
});
res.json({contacts,nextBirthdays})
}捕获(错误){
res.status(500).json({message:error.message})
}
})
异步函数getNextBirthdays(联系人){
contacts.forEach(异步(contact)=>{
let daysTillBirthday=等待getDaysTillBirthday(contact.dob)
如果(DayStillBirth<10&&DayStillBirth>0){
console.log(${contact.firstname}的生日在${daysillbirth}天内)
下一个星期({
名字:contact.firstname,
日期:DaystillBirth
})
}
//返回具有下一个生日的对象
下周一返回
})
}
异步函数getDaysTillBirthday(\u birthday){
const生日=等待一年的生日(_生日)
const today=等待一年中的某一天()
const days=生日-今天
返回等待日;
}
异步函数birthdayofyear(日期){
const now=日期;
const start=新日期(now.getFullYear(),0,0);
const diff=现在-开始;
const one day=1000*60*60*24;
施工日=数学楼层(差异/一天);
返回等待日
}
异步函数DayOfYear(){
const now=新日期();
const start=新日期(now.getFullYear(),0,0);
const diff=现在-开始;
const one day=1000*60*60*24;
施工日=数学楼层(差异/一天);
返回等待日
}
您的代码应该如下所示:
router.get('/',async(req,res)=>{
试一试{
const contacts=wait Contact.find()
const nextBirthdays=getNextBirthdays(联系人)
res.json({contacts,nextBirthdays});
}捕获(错误){
res.status(500).json({message:error.message})
}
})
函数getNextBirthdays(联系人){
让nextBirthdays=[];
contacts.forEach(contact=>{
let daysTillBirthday=getDaysTillBirthday(contact.dob)
如果(DayStillBirth<10&&DayStillBirth>0){
console.log(${contact.firstname}的生日在${daysillbirth}天内)
下一个星期({
名字:contact.firstname,
日期:DaystillBirth
})
}
})
//返回具有下一个生日的对象
下周一返回
}
函数getDaysTillBirthday(\u birthday){
常数生日=一年的生日(_生日);
const today=一年中的某一天();
返回生日-今天;
}
函数年的生日(日期){
const now=日期;
const start=新日期(now.getFullYear(),0,0);
const diff=现在-开始;
const one day=1000*60*60*24;
返回数学楼层(差异/一天);
}
函数DayOf Year(){
const now=新日期();
const start=新日期(now.getFullYear(),0,0);
const diff=现在-开始;
const one day=1000*60*60*24;
返回数学楼层(差异/一天);
}
module.exports=路由器;
所有用于调用生日的实用程序函数都可以编写为同步函数,因为您不需要像对待联系人那样“等待”结果。find();它们只是立即返回的算术运算
虽然可以将这些函数作为异步函数编写,但这是不必要的,因此只需从所有这些函数中删除所有的async
修饰符,然后在return语句中删除所有的wait
s即可
然后在构建生日结果数组的forEach
循环中删除async
所以要理解的关键是,你的生日计算可以同步进行,所以根本不需要解决任何承诺。要了解如何解决承诺,您可以使用dayofyear
作为示例,将函数编写为如下异步函数:
function dayOfTheYear() {
return new Promise((resolve) => {
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);
resolve(day); // this is you resolving the promise you return
});
}
如果我们使用上述功能,将有两种不同的方法:
dayOfTheYear()
.then( (resolvedValue) => console.log(resolvedValue) )
resolvedValue
是在调用resolve(day)
时在函数中解析的值
或者,您可以使用wait
,而不是使用then
函数传入回调:
// assuming this code is in a function declared as async
const resolvedValue = await dayOfTheYear();
因此,从上面可以看到,来自异步函数的return
语句与来自承诺回调的resolve
调用的作用相同
最后一件事:从您的代码中可以明显看出,您对函数声明为异步感到困惑。如果要使用await
等待a承诺解析,则可以声明函数为async。如果不声明async,就不能等待任何东西。但你只能等待承诺
在幕后,所有这些都是承诺,所有的承诺都只是回馈
希望这有点帮助。看起来您的任何函数都不需要异步。
await
在forEach
中不起作用,您的getnextbirthdies
实际上不返回任何内容,因为forEach
总是重新运行未定义的
@dancintr,它起作用,它只是不做你认为它做的事。@DannisFink看这个视频:看这个视频:
// assuming this code is in a function declared as async
const resolvedValue = await dayOfTheYear();