我是Promises的新手,无法掌握其工作方式。我有一个要返回的MySQL语句列表。我尝试使用Promise.all
将每个语句添加为Promise,但是Promise.all
从未等待嵌套的Promise完成。关于SO的类似问题也存在诸如“不归还承诺”之类的问题,这不是我的问题。如果有人可以提供指导,我保证我会非常感激。
class Database {
constructor( config ) {
this.connection = mysql.createConnection( config );
}
query( sql, args ) {
return new Promise( ( resolve, reject ) => {
this.connection.query( sql, args, ( err, rows ) => {
if ( err )
return reject( err );
resolve( rows );
} );
} );
}
close() {
return new Promise( ( resolve, reject ) => {
this.connection.end( err => {
if ( err )
return reject( err );
resolve();
} );
} );
}
}
function scanCountWrapper(resname, resProjectDict){
var sql = "SELECT COUNT(*) FROM table WHERE resource = '" + resname + "'";
database.query(sql).then( count => { // query returns a Promise (see above function definition)
return new Promise((resolve) => { // nested promise
resProjectDict[resname] = count[0]["COUNT(*)"];
resolve(count[0]["COUNT(*)"]);
})
})
}
function getAnyCount(latestResourceList, cb){
var resProjectDict = {};
var scanPromises = [];
for (r=0;r<latestResourceList.length;r++){
var resname = latestResourceList[r];
console.log("resource is " + resname);
scanPromises.push(scanCountWrapper(resname, resProjectDict)); //add Promise
}
Promise.all(scanPromises)
.then((values) => { // this doesn't wait for the nested promises to finish executing
console.log(resProjectDict); // EMPTY because nested promises have not exeecuted.
})
}
编辑
对不起,忘了提到查询也返回了一个Promise(我在上面添加了该函数)
答案 0 :(得分:2)
您正在将Promise.all()
的返回值数组传递给scanCountWrapper()
。但是scanCountWrapper()
不会返回任何内容,因此您只是传递了Promise.all()
和undefined
值的数组。
相反,您需要向其传递一个承诺数组。因此,scanCountWrapper()
需要返回一个连接到其中的异步操作的Promise。
您可以通过将database.query(...).then(...)
更改为return database.query(...).then(...)
来做到这一点:
function scanCountWrapper(resname, resProjectDict){
var sql = "SELECT COUNT(*) FROM table WHERE resource = '" + resname + "'";
return database.query(sql).then( count => {
resProjectDict[resname] = count[0]["COUNT(*)"];
return count[0]["COUNT(*)"];
});
}
此外,您无需在.then()
处理程序中创建承诺。您可以直接从.then()
处理程序中返回一个值,该值将成为父承诺链的已解析值。