Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript中从promise返回值?_Javascript_Node.js_Async Await_Promise_Es6 Promise - Fatal编程技术网

如何在javascript中从promise返回值?

如何在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

我对承诺是相当陌生的,现在我被卡住了。我读了几篇文章和一些帖子,但我无法理解

我有一个简单的API,它返回一组人和一些属性,如firstname、lastname和d.o.b。我想在接下来的10天内检查生日。现在我被返回承诺的函数卡住了。我希望API返回一个数组,其中包含一个用于人的数组和一个用于下一个星期的数组

我如何解决承诺

(我知道计算日期的部分不是最优雅的方式)

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();