2017-10-15 233 views
0

嗨,我是新手来表达和承诺,我试图从express路由器使用promise.all调用多个异步函数,但它返回undefined,请指导我解决问题。Express js promise.all返回undefined

user.js的//路线

var findAllUsersDetails = function(router){ 
     router.post('/api/v1/users/getAllUserFormDetails', 
     function (req, res) { 
      Promise.all([ 
       userModel.getAllUsers(req), 
       userModel.getAllUsers(req), 
      ]) 
      .then((data) => console.log(data)) 
      .catch((err) => console.log(err)) 
    }); 
} 

user.js的//模式

var userModel = { 
getAllUsers : function(req){ 
    var string = ""; 
    var id_company = req['user'].id_company; 
    var dbConnection = dbConnectionCreator(); 
    var getAllUsers = getAllUsersSqlString(string, id_company); 
    console.log("ANGEL: finding all employees"); 

    dbConnection.query(getAllUsers, function(error, results, fields){ 
     return new Promise((resolve, reject) => { 
       console.log(results); 
      if (error) { 
       dbConnection.destroy(); 
       console.log("error: ", error); 
       return reject (err); 
      } else if (results.length === 0) { 
       resolve("User not found."); 
      } else { 
       resolve(results); 
       //return (callback({employeeData: results})); 
      } 
      }) 
    });  
}, 
} 
module.exports = userModel; 
+1

初学者错误,从回调中返回某些内容会将其返回给回调的调用者,而不是创建回调的地方。仔细阅读'getAllUsers'。事实上,它什么都没有返回。 –

回答

1

userModel.getAllUsers(req)应该返回Promise a.e:

function getAllUsers(req) { 
    return new Promise(function(resolve, reject){ 
    //... 
    }); 
} 

你的情况dbConnection.query(getAllUsers, function(error, results, fields)返回Promise因此你可以写这样的:

getAllUsers : function(req){ 

    var string = ""; 
    var id_company = req['user'].id_company; 
    var dbConnection = dbConnectionCreator(); 
    var getAllUsers = getAllUsersSqlString(string, id_company); 
    console.log("ANGEL: finding all employees"); 

    return dbConnection.query(getAllUsers, function(error, results, fields){ 
// ^^^ 
     return new Promise((resolve, reject) => { 
       console.log(results); 
      if (error) { 
       dbConnection.destroy(); 
       console.log("error: ", error); 
       return reject (err); 
      } else if (results.length === 0) { 
       resolve("User not found."); 
      } else { 
       resolve(results);      
      } 
      }) 
    });  
}, 
+0

是的,你们是对的,退回承诺是问题,dbConnection.query不退还承诺的决心或拒绝 – veeran

1

getAllUsers功能有望恢复Promise,但返回undefined(无)。

该承诺返回dbConnection.query,但不是getAllUsers函数。您可以尝试添加return

return dbConnection.query

如果这不起作用,那么的DBQuery不会返回它返回到它的回调。

您可能需要找到替代方案来解决此问题。

让我知道它是否有效。

0

我所做的是什么,我把承诺函数中DBConnection的,现在我可以dbConnection.query的结果()

getAllUsers : function(req){ 
    var string = ""; 
    var id_company = req['user'].id_company; 
    var dbConnection = dbConnectionCreator(); 
    var getAllUsers = getAllUsersSqlString(string, id_company); 
    console.log("ANGEL: finding all employees"); 

    return new Promise((resolve, reject) => { 
     dbConnection.query(getAllUsers, function(error, results, fields){ // 
      console.log(results); 
      if (error) { 
       dbConnection.destroy(); 
       console.log("error: ", error); 
       return reject (err); 
      } else if (results.length === 0) { 
       resolve("User not found."); 
      } else { 
       resolve(results); 
       //return (callback({employeeData: results})); 
      } 
     }); 
     }); 

感谢您的立即答复回报的承诺,其实我明白的问题是因为回答你的答案。

+0

欢迎接受任何答案帮助你解决问题。 –