javascript - 承诺一切不开火
问题描述
我试图让承诺第一次起作用。但是,我Promise.all
的永远不会开火。
我正在使用 node.js & express
const promises = [
new Promise( () => {
var query = `...`;
mssql.query(query, function(obj){
finalRes['key1'] = obj.recordset;
return true;
//this works
});
}),
new Promise( () => {
var query = `...`;
mssql.query(query, function(obj){
finalRes['key2'] = obj.recordset;
return true;
//this works
});
}),
...
]
Promise.all(promises).then(() => {
res.send(finalRes);
// this is never firing
});
我一直在谷歌搜索,但找不到解决方案。我会很感激有人指出我在这里做错了什么。
干杯
解决方案
您的承诺创建代码是错误的,因为它们永远不会解决。您实际上应该做的是resolve
在基于回调的代码中触发函数。我会走得更远——让所有这些承诺都用它们的结果来解决,而不是修改一些外部价值。像这样:
const promises = [
new Promise( (resolve, reject) => {
var query = `...`;
mssql.query(query, function(obj){
resolve({key1:obj.recordset});
});
}),
new Promise( (resolve, reject) => {
var query = `...`;
mssql.query(query, function(obj){
resolve({key2:obj.recordset});
});
}) // ...
];
Promise.all(promises).then(results => {
res.send(Object.assign({}, ...results));
});
根据查询的构建方式,您可能会走得更远——编写一个通用的查询生成器函数,它将查询和键作为参数,并返回一个承诺。同样,这个函数应该很容易测试。
作为旁注,您的代码过于乐观,它还应该为每个查询提供带有调用的error
回调。reject()
推荐阅读
- c# - CommandLineParser - 如果没有给出开关,则显示 --help 结果
- django - 使用 ModelSerializer 保存嵌套多对多关系的问题
- python - LSTM模型在多类分类中只分类1类
- wordpress - 使用带有 elementor/divi 的 wordpress 扩展网站
- google-chrome - Vuetify:禁用 chrome 中的自动完成功能
- python - 在 COM 端口上写入和读取 bytearray
- powershell - 在不使用向上箭头的情况下获取最后执行的命令作为输出 - PowerShell
- laravel - 编辑表单中的 Select2 不会触发编辑表单中的选定值 - Livewires
- java - 如何确定纯文本编码?
- html5-video - 将 HTML 视频播放到指定时间