我正在构建一个网络应用程序,允许用户查看项目的仪表板,这些仪表板又具有单独的部分(a、b 和 c),仪表板将显示为完整 (o) 或不完整 (x)如下图所示。这允许用户直接导航到缺少信息的页面,因为需要项目的所有信息才能进入下一阶段。
Item | a | b | c | Next Stage?
------------------------------
abc | x | o | x | No
def | x | x | x | No
ghi | o | o | o | Yes
在每个项目(例如 abc)中,它可以有许多子项目,这些子项目必须全部完成,该项目的 a、b 或 c 部分才能标记为完成。这是通过一系列嵌套的 promise 实现的,这些 promise 会在更新子项时更新“完整性”变量。但是,当尝试将变量从子项(a's、b's、c's)的范围传输到父项(abc、def、ghi)时,就会出现问题。我以前使用过嵌套的 promise 而没有实现异步/等待,因为这是这个项目范围内 promise 的最终用法,我犹豫是否采用不同的方式来解决这个问题(但我并不反对它)。
当前实现:
exports.loadDashboard = (req, res, next) => {
Item.find()
.where("user").equals(req.session.user)
.select()
.exec()
.then(docs => {
const response = {
items: docs.map(doc => {
const aPromise = Feature.find().where("projectID").equals(doc._id).select("aComplete").exec();
const bPromise = Feature.find().where("projectID").equals(doc._id).select("bComplete").exec();
const cPromise = Feature.find().where("projectID").equals(doc._id).select("cComplete").exec();
Promise.all([aPromise, bPromise, cPromise]).then(result => {
return{
_id: doc._id,
user: doc.user,
aComplete: result[0],
bComplete: result[1],
cComplete: result[2]
}
// })
}
),
userSessionID: req.session.user
}
if(req.session.user != null){
console.log(response);
res.render("dashboard", {response});
}else{
res.redirect("login");
}
})
.catch(err=>{
console.log(err);
res.status(500).json({
error: err
});
});
...授予 response的:
{ items: [ undefined, undefined, undefined ],
userSessionID: '1' }
这些未定义项的类型是 Promise <Pending> ,并且类似的问题已经以类似的方式解决了,但是这次我很困惑。我的问题是,是否可以在不深入研究 async/await 的情况下解决这个问题,或者我应该咬紧牙关,如果是这样的话,我将非常感谢所提供的任何帮助。
感谢阅读
最佳答案
这里有很多事情要做,如果可能的话,切换到使用 async/await 而不是使用 Promises,因为这是使您的代码相当难以维护的主要原因之一。我相信您可能只需要实际返回正确的值。
您的 .map 函数不返回任何内容,这可能是您收到 [undefined, undefined, undefined] 的主要原因。
exports.loadDashboard = (req, res, next) => {
// don't use "where", if you don't have to
Item.find({user: req.session.user)
.exec()
.then(docs => {
const items = docs.map(doc => {
const aPromise = Feature.find().where("projectID").equals(doc._id).select("aComplete").exec();
const bPromise = Feature.find().where("projectID").equals(doc._id).select("bComplete").exec();
const cPromise = Feature.find().where("projectID").equals(doc._id).select("cComplete").exec();
// THIS IS WHERE I ADDED THE RETURN!
return Promise.all([aPromise, bPromise, cPromise])
.then(result => {
return {
_id: doc._id,
user: doc.user,
aComplete: result[0],
bComplete: result[1],
cComplete: result[2]
}
}
)})
return Promise.all(items);
})
.then(items => {
const response = {
userSessionID: req.session.user,
items
};
// also check if .user is undefined, the null check is then optional
if(!req.session.user || req.session.user === null){
return res.redirect("login");
}
console.log(response);
return res.render("dashboard", {response});
}).catch(error => {
console.log(error);
res.status(500).json({error});
});
看看进展如何。我相信可能仍然存在一些问题,但该大纲应该能让您更轻松地使用它。
关于javascript - Promise.all() 返回未定义的 Promise <Pending> 数组,尽管类似的解决方案返回成功的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56166605/
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
“输出”是一个序列化的OpenStruct。定义标题try(:output).try(:data).try(:title)结束什么会更好?:) 最佳答案 或者只是这样:deftitleoutput.data.titlerescuenilend 关于ruby-on-rails-更好的替代方法try(:output).try(:data).try(:name)?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c
所以我开始关注ruby,很多东西看起来不错,但我对隐式return语句很反感。我理解默认情况下让所有内容返回self或nil但不是语句的最后一个值。对我来说,它看起来非常脆弱(尤其是)如果你正在使用一个不打算返回某些东西的方法(尤其是一个改变状态/破坏性方法的函数!),其他人可能最终依赖于一个返回对方法的目的并不重要,并且有很大的改变机会。隐式返回有什么意义?有没有办法让事情变得更简单?总是有返回以防止隐含返回被认为是好的做法吗?我是不是太担心这个了?附言当人们想要从方法中返回特定的东西时,他们是否经常使用隐式返回,这不是让你组中的其他人更容易破坏彼此的代码吗?当然,记录一切并给出
我想学习一些关于Continuation的知识,使用callcc方法从一些文章中键入几个示例,但我遇到了错误:NoMethodError:undefinedmethod`callcc'formain:Objectfrom(pry):2:in`'没有文章提到包含延续库。那么如何解决这个问题呢?谢谢编辑:ruby1.9.2p290(2011-07-09修订版32553)[x86_64-linux] 最佳答案 您需要要求“继续”。require'continuation' 关于ruby-继续,
为什么以下不同?Time.now.end_of_day==Time.now.end_of_day-0.days#falseTime.now.end_of_day.to_s==Time.now.end_of_day-0.days.to_s#true 最佳答案 因为纳秒数不同:ruby-1.9.2-p180:014>(Time.now.end_of_day-0.days).nsec=>999999000ruby-1.9.2-p180:015>Time.now.end_of_day.nsec=>999999998