Javascript Promise.all不等待嵌套的Promise?
我对承诺不熟悉,无法理解它们是如何运作的。我有一个MySQL语句列表,我想在返回它们的值之前完成这些语句。我尝试使用Javascript Promise.all不等待嵌套的Promise?,javascript,promise,Javascript,Promise,我对承诺不熟悉,无法理解它们是如何运作的。我有一个MySQL语句列表,我想在返回它们的值之前完成这些语句。我尝试使用Promise.all将每个语句添加为Promise,但Promise.all从不等待嵌套的Promise完成。类似的问题也有类似的问题,比如不兑现承诺,这不是我的问题。如果有人能提供指导,我保证我会非常感激 class Database { constructor( config ) { this.connection = mysql.createConn
Promise.all
将每个语句添加为Promise,但Promise.all从不等待嵌套的Promise完成。类似的问题也有类似的问题,比如不兑现承诺,这不是我的问题。如果有人能提供指导,我保证我会非常感激
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.
})
}
类数据库{
构造函数(配置){
this.connection=mysql.createConnection(config);
}
查询(sql、args){
返回新承诺((解决、拒绝)=>{
this.connection.query(sql,args,(err,rows)=>{
如果(错误)
退货拒绝(err);
解析(行);
} );
} );
}
关闭(){
返回新承诺((解决、拒绝)=>{
this.connection.end(err=>{
如果(错误)
退货拒绝(err);
解决();
} );
} );
}
}
函数scanCountWrapper(resname、resProjectDict){
var sql=“从resource=”+resname+“”的表中选择COUNT(*);
然后(count=>{//query返回一个承诺(参见上面的函数定义)
返回新承诺((解析)=>{///嵌套承诺
resProjectDict[resname]=计数[0][“计数(*)”];
解析(计数[0][“计数(*)”]);
})
})
}
函数getAnyCount(latestResourceList,cb){
var resProjectDict={};
var=[];
对于(r=0;r{//这不会等待嵌套承诺完成执行
console.log(resProjectDict);//为空,因为嵌套的承诺尚未执行。
})
}
编辑
抱歉,忘了提及查询也返回承诺(我在上面添加了该函数)您正在传递给promise.all()
一个来自scanCountWrapper()的返回值数组。但是scanCountWrapper()
不返回任何内容,因此您只是传递Promise.all()
和未定义的值数组
相反,您需要向它传递一系列承诺。因此,scanCountWrapper()
需要返回一个连接到其内部异步操作的承诺
您可以通过将database.query(…)。然后(…)
更改为return database.query(…)。然后(…)
:
此外,在.then()
处理程序中创建的承诺是不必要的。您可以直接从处理程序()返回一个值,该值将成为父承诺链的解析值。您将传递给promise.all()
一个来自scanCountWrapper()
的返回值数组。但是scanCountWrapper()
不返回任何内容,因此您只是传递Promise.all()
和未定义的值数组
相反,您需要向它传递一系列承诺。因此,scanCountWrapper()
需要返回一个连接到其内部异步操作的承诺
您可以通过将database.query(…)。然后(…)
更改为return database.query(…)。然后(…)
:
此外,在.then()
处理程序中创建的承诺是不必要的。您可以直接从.then()
处理程序返回一个值,该值将成为父承诺链的解析值。scanCountWrapper
不返回任何内容,更不用说承诺了。您需要解析scanCountWrapper,请参见编辑。thankswrapdatabase.query(sql)。然后(
转换为一个承诺,如返回新承诺((resolve1,reject1)=>{……;resolve1(count[0][“count(*)”);})
;在代码中,函数内的return语句=**scanCountWrapper**在承诺范围内。然后在database.query(sql)之前缺少一个return
。然后,
scanCountWrapper
不会返回任何内容,更不用说承诺了。您需要解析scanCountWrapper,请参阅edit.thankswrapdatabase.query(sql)。然后(
转换为一个承诺,如返回新承诺((resolve1,reject1)=>{……;resolve1(count[0][“count(*);})
;在代码中,函数=**scanCountWrapper**中的return语句在承诺范围内。然后在数据库查询(sql)之前缺少return
。然后
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(*)"];
});
}