【发布时间】:2017-10-19 07:39:44
【问题描述】:
在构建自定义端点时,我经常需要解析包含 Promise 的复杂对象。
举个例子:
给定已知用户的 id、employeeId 和 memberGroupsIds(一个数组):
var loginResponse = {
userprofile : getProfile(id)
companyInfo : {
company : getCompany(employeeId)
companyRelations : getPriviligedInfo(employeeId)
}
groups : getGroups(memberGroupsIds)
}
此逻辑适用于仅返回其值的同步函数。但是对于返回承诺的函数,我必须手动将它们全部推送到一个数组中,以确保它们在使用最终对象之前得到解决。
我发现上面的代码很容易理解,我正在寻找一个能够提供其中一些功能的签名,同时仍然确保在将最终对象发送给客户端之前解决承诺。
问题不在于让它工作,而是让它美观且易于阅读。
最好的答案是确保将值返回到对象中的预期键,并且所有承诺都并行解决,同时保持与同步函数的结构有点兼容的结构。
或者,如果我没有抓住重点并且看错了,我应该如何看待它?
【问题讨论】:
-
var loginResponse = Promise.all([getProfile(Id), getCompany(EmployeeId), getPriviligedInfo(EmployeeId), getGroups(MemberGroupsIds)]).then(([userprofile, company, companyRelations, groups]) => ({ userprofile, companyInfo: { company, companyRelations }, groups}));- 当然,你不能只使用loginResponse作为值,因为它是一个承诺......所以,使用将是loginResponse.then(obj => { ... do things here ... }); -
是的,这行得通,但并没有真正说明返回对象的结构/如何随着需求的扩展而容易添加新的子对象(想象这用于对象 10乘以示例的大小/复杂性)
-
显然在一行这样它并不漂亮 - 你想要 working 代码还是 pretty 代码 - 猜你可以使用 async/await 来让它漂亮
-
我想要漂亮的代码 :) 正如我所说,问题不是让它工作,而是让它的语法有点类似于示例对象的语法
-
不敢相信没有人建议。 IMO,真正的方法是使用一次调用服务器返回您需要的所有数据,而不必等待 4 个单独的调用完成。没有人说漂亮的代码就是聪明的代码。
标签: javascript express promise loopbackjs bluebird