簡體   English   中英

Promise.all 不等待嵌套的 promise?

[英]Promise.all does not wait for nested promise?

我是 Promises 的新手,無法理解它們是如何工作的。 我有一個 MySQL 語句列表,我想在返回它們的值之前完成。 我嘗試使用Promise.all將每個語句添加為 Promise,但Promise.all從不等待嵌套的 ZA789AZF0F20CFFE47474474AC 完成。 關於 SO 的類似問題有類似也不返回 Promises 的問題,這不是我的問題。 如果有人可以提供指導我 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.
    })
}

編輯

抱歉忘記提及查詢也返回 promise(我在上面添加了 function)

您正在向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()處理程序中創建的 promise 是不必要的。 您可以直接從.then()處理程序返回一個值,該值將成為父 promise 鏈的解析值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM