Nodejs结合了我的sql命令的两个结果

我有两个mySql命令作为从数据库中得到的结果,我试图让他们与下面的代码,但它不能正常工作

例如:

userEwallets表中获取结果:

 function getMoneySenderUserInfo(data, callback) { var sourceEwalletNumber = data.transferToEwallet.substring(0, 5) + data.registeredMobileNumber.substring(1, data.registeredMobileNumber.length); var query = "SELECT userEwallets.id as ewalletId, users.id as userId , money_repositories.money as money FROM userEwallets " + "JOIN users ON users.id = userEwallets.userId " + "JOIN money_repositories ON userEwallets.id = money_repositories.ewalletId " + "WHERE ewalletNumber = '" + sourceEwalletNumber + "' "; connection.query(query, function (err, results) { if (err) return callback(false); if (results.length === 0) return callback(false); callback(true, results[0]); }); } 

userEwallets表中得到结果再得到其他结果:

 function getDestinationTakeMoneyUserInfo(data, callback) { var query = "SELECT users.id as userId FROM userEwallets " + "JOIN users ON users.id = userEwallets.userId " + "WHERE ewalletNumber = '" + data.transferToEwallet + "' "; connection.query(query, function (err, results) { if (err) return callback(false); if (results.length === 0) return callback(false); callback(true, results[0]); }); } 

现在我想结合这个结果与这个代码:

 usersInformation = {}; getMoneySenderUserInfo(data, function (success, result) { if (success) { usersInformation['senderId'] = result.userId; usersInformation['ewalletId'] = result.ewalletId; usersInformation['money'] = result.money; getDestinationTakeMoneyUserInfo(data, function (success, result) { usersInformation['destinationUserId'] = result.userId; }); } log.info(usersInformation); }); 

你应该使用Promise

我给你举个例子

 function getMoneySenderUserInfo(data) { var promise = new Promise( function(resolve, reject) { var query = "..." connection.query(query, function (err, results) { if (err || results.length === 0) { reject(); } else { resolve(results[0]); } }); return promise; } 

你必须为getDestinationTakeMoneyUserInfo函数做同样的事情

那么你可以得到你的最终结果是这样的:

 var usersInformation = {}; Promise.all([getMoneySenderUserInfo(data), getDestinationTakeMoneyUserInfo(data)]) .then(function (results) { usersInformation['senderId'] = results[0].userId; usersInformation['ewalletId'] = results[0].ewalletId; usersInformation['money'] = results[0].money; usersInformation['destinationUserId'] = result[1].userId; }); 

正如你可以看到Promise.all将等待这两个数据库请求,callback(传递在then函数)将被调用时,这两个promise将被parsing,所以你可以最终检索到这两个结果。

你也可以像这样链接承诺:

 getMoneySenderUserInfo(data) .then(function (result) { usersInformation['senderId'] = result.userId; usersInformation['ewalletId'] = result.ewalletId; usersInformation['money'] = result.money; return getDestinationTakeMoneyUserInfo(data); }).then(function (result) { usersInformation['destinationUserId'] = result.userId; }); 

您在这里遇到的问题是从数据库获取数据asynchronous发生。 这就是为什么你必须使用callback函数来处理结果。

举个例子,比如你的函数getMoneySenderUserInfo 。 当你调用它时,它会调用connection.query和你的SQL查询,然后继续执行下一个指令。 然后,在这个函数完成之后的某个时间点,你的SQL库会收到你的查询结果,然后调用你的callback函数。

把这个应用到最终代码中,调用函数底部的log.info(usersInformation)将不包含destinationUserId ,因为你的callback函数还没有被调用。

如果您将log.info调用移动到log.info的callbackgetDestinationTakeMoneyUserInfo ,则会得到您期望的结果。

 getMoneySenderUserInfo(data, function (success, result) { // This happens first if (success) { usersInformation['senderId'] = result.userId; usersInformation['ewalletId'] = result.ewalletId; usersInformation['money'] = result.money; getDestinationTakeMoneyUserInfo(data, function (success, result) { // This (probably) happens third usersInformation['destinationUserId'] = result.userId; }); } // This happens second log.info(usersInformation); }); 

如果您好奇或想了解更多关于这一切的情况,请查看Philip Roberts的精彩video 。