我正在尝试第一次实现承诺。但是,我的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
});
我一直在搜索资料,但找不到解决方案。我希望有人指出我在这里做错了什么。
欢呼
答案 0 :(得分:1)
您的诺言创建代码是错误的,因为它们永远无法解决。您实际上应该做的是在基于回调的代码中使用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));
});
根据查询的构建方式,您可能会走得更远-编写一个通用的查询生成器函数,该函数将查询和键作为参数,并返回一个promise。同样,此功能应该易于测试。
作为一个附带说明,您的代码过于乐观,它还应提供error
回调,并向每个查询调用reject()
。