javascript-在节点中使用psql(pg-promise),在for loops / promise.all内部承诺
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript-在节点中使用psql(pg-promise),在for loops / promise.all内部承诺,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2644字,纯文字阅读大概需要4分钟。
内容图文
您好,我是Promises的新手,他一直在等待如何在for循环中解析所有promise之后再转到下一个then().我已经看到了两个promise.all示例,但是我不清楚如何使它们适应下面的代码.当前,它转到for循环之后的下一个then(),并在for循环完成之前进行解析.任何帮助表示赞赏!
我正在使用pg-promise(带有Promise的psql).
原始代码:
function getTeamMembers(aTeam) {
let promise = new Promise(function(resolve, reject) {
db.getTeamMembers(aTeam.tid) //return sql results rows
.then(function(rows){
for(let i=0; i<rows.length; ++i) { //loop through each result row
getUserByUsername(rows[i].username)
.then(function(cfUser) { //add user from row to aTeam object
aTeam.addMember(cfUser);
})
.catch(function(e) {
reject(e);
});
}
})
.then(function(){
console.log(aTeam); //confirm added properly
resolve(aTeam); //resolve object
})
.catch(function(e) {
console.log('addMemberToTeamByUsername: '+e.stack);
reject(e);
});
});
return promise;
}
解决方法:
我是pg-promise的作者.
以下是在此上下文中关于Promise.All的无效使用的一些注意事项,此答案现已删除.
使用表示物理资源的基于承诺的界面时,了解所使用的物理环境非常重要.没有它,您可能会因为物理资源无法像您的通用承诺解决方案那样规模扩展这一简单事实而陷入瓶颈.
如果是pg-promise,则您的物理环境由两部分组成:
>查询要通过Node.js IO传递的字符串
>连接池提供的连接上下文
每个查询请求从连接池获取并释放连接,这是非常有限的物理资源.池的默认大小为10,由基础驱动程序node-postgres设置.尽管可以将其增加到最多100个,但这样做会开始在连接管理上造成过载,因此它的可伸缩性并不那么好.通常将增量设置为20,这大约是平均值.
因此,如果您在查询数组中使用Promise.all,则您的应用程序将几乎立即耗尽该池,并且对服务的下一个请求都将坐在那里等待可用的连接.
这种解决方案根本无法扩展,在此处列出为查询执行的反模式:Tasks versus root/direct queries.
基本上,这说明您必须通过任务执行多个查询:
>方法task,如果您不更改数据
>方法tx(交易),如果要更改数据
这样,您可以通过单个连接通过管道传输所有查询,这对于实现服务的可伸缩性至关重要.
Learn By Example教程中有很多针对Tasks和Transactions的示例.
考虑到您尝试获取多个父行,然后获取多个子行,则应查看以下问题:get JOIN table as array of results with PostgreSQL/NodeJS.
我也建议阅读Performance Boost文章,以更好地理解执行多重查询的物理限制以及如何解决它们.
例
function getTeamMembers(aTeam) {
return db.task(t=> {
return t.map('SELECT * FROM team_members WHERE id=$1', aTeam.id, tm=> {
return t.any('SELECT * FROM users WHERE name=$1', tm.username)
.then(users=> {
tm.users = users;
return tm;
});
}).then(t.batch);
});
}
// usage example:
getTeamMembers({id: 123})
.then(members=> {
// members = array of member objects
})
.catch(error=> {
// error
});
这不是唯一的方法,但是它是最短的;)
在以下问题中对该方法进行了更好的考虑:get JOIN table as array of results with PostgreSQL/NodeJS.
内容总结
以上是互联网集市为您收集整理的javascript-在节点中使用psql(pg-promise),在for loops / promise.all内部承诺全部内容,希望文章能够帮你解决javascript-在节点中使用psql(pg-promise),在for loops / promise.all内部承诺所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。