2017-06-10 92 views
-1

我有一个node.js代码,我想等待所有的sql查询完成 ,然后处理下一部分。Promises.all()不等待承诺的解决方案

这里我返回承诺并存储在数组中。 所有的承诺都返回后,我想做一些计算。 但似乎Promises.all()没有等待承诺得到解决,并在计算阶段给我0?

有人可以帮我解决这个问题吗?

var results= []; 
    var salaries = 0; 
    var numberOfWorking = 0; 
    var numberOfNotFound = 0; 
    var numberOfFound = 0; 
    var averageSalary = 0; 
    var promises = []; 
    for (grad in graduates) { 
     promises.push(function() { 
     return new Promise(function (resolve, reject) { 
      var entree = graduates[grad]; 
      console.log("entree:", JSON.stringify(entree)); 
      var query = "SELECT Salary FROM employment WHERE FirstName='" + entree['firstName'] + "' AND MiddleName='" + entree['middleName'] + "'" + 
      "AND LastName='" + entree['lastName'] + "' AND DOB='" + entree['birth'] + "'"; 

      connection.query(query, function (err, rows, fields) { 
      if (!err) { 

       if (rows.length == 0) { 
       numberOfNotFound = numberOfNotFound + 1; 
       } 
       else { 

       var Salary = parseInt(rows[0].Salary, 10) 
       console.log("Salary", Salary); 
       numberOfFound = numberOfFound + 1; 
       salaries += Salary; 
       if (Salary > 0) { 
        numberOfWorking = numberOfWorking + 1; 
       } 
       console.log("salaries", salaries); 
       console.log("numberOfFound", numberOfFound); 
       console.log("numberOfWorking", numberOfWorking); 
       resolve(true); 
       } 
      } 
      else { 
       console.log(req.body); 
       console.log("ERROR:", err); 
       reject(err); 
      } 
      }); 
     }); 
     }); 
    } 
    Promise.all(promises).then(function (dataArr) { 
     if (numberOfFound > 0) { 
     averageSalary = salaries/numberOfFound; 
     } 
     else { 
     averageSalary = 0; 
     } 
     console.log("salaries", salaries); 
     console.log("averageSalary", averageSalary); 
     console.log("numberOfFound", numberOfFound); 
     console.log("numberOfWorking", numberOfWorking); 
     var tosendOnePkg = {}; 

     tosendOnePkg = { 
     "packageID": pId, 
     "numberOfPersons": numberOfFound + numberOfNotFound, 
     "numberOfWorkingPersons": numberOfWorking, 
     "notFoundPersons": numberOfNotFound, 
     "averageSalary": averageSalary 
     } 
     tosendOnePkg['packageID'] = package; 
     results.push(tosendOnePkg); 
    }); 
+2

promises似乎是一个**函数的数组** - 从未执行的函数 - 尝试删除'function()return'和相应的'}' –

+0

也是''tosendOnePkg ['packageID'] = package ;'似乎是奇怪的代码,因为包没有在任何地方定义,并且'tosendOnePkg.packageID'在前面的语句中被设置为'pId'! –

+0

@JaromandaX谢谢!其实这只是代码的一部分,而不是完整的代码! –

回答

0

的问题是,您要添加功能的承诺阵列,看到你的实例进行线上9:

promises.push(function() { 
    return new Promise(function (resolve, reject) { 
     ... 
    } 
}); 

相反,你应该补充承诺本身:

promises.push(new Promise(function (resolve, reject) { 
    ... 
}); 
+0

谢谢!它的工作 –

+0

很高兴听到:-) –