Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Promise.all不等待嵌套的Promise?_Javascript_Promise - Fatal编程技术网

Javascript Promise.all不等待嵌套的Promise?

Javascript Promise.all不等待嵌套的Promise?,javascript,promise,Javascript,Promise,我对承诺不熟悉,无法理解它们是如何运作的。我有一个MySQL语句列表,我想在返回它们的值之前完成这些语句。我尝试使用Promise.all将每个语句添加为Promise,但Promise.all从不等待嵌套的Promise完成。类似的问题也有类似的问题,比如不兑现承诺,这不是我的问题。如果有人能提供指导,我保证我会非常感激 class Database { constructor( config ) { this.connection = mysql.createConn

我对承诺不熟悉,无法理解它们是如何运作的。我有一个MySQL语句列表,我想在返回它们的值之前完成这些语句。我尝试使用
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,请参见编辑。thankswrap
database.query(sql)。然后(
转换为一个承诺,如
返回新承诺((resolve1,reject1)=>{……;resolve1(count[0][“count(*)”);})
;在代码中,函数内的return语句=**scanCountWrapper**在承诺范围内。然后在
database.query(sql)之前缺少一个
return
。然后,
scanCountWrapper
不会返回任何内容,更不用说承诺了。您需要解析scanCountWrapper,请参阅edit.thankswrap
database.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(*)"];
  });
}