2017-10-15 232 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

歡迎接受任何答案幫助你解決問題。 –