在代码中
var stuff_i_want = '';
stuff_i_want = get_info(parm);
Run Code Online (Sandbox Code Playgroud)
函数get_info:
get_info(data){
var sql = "SELECT a from b where info = data"
connection.query(sql, function(err, results){
if (err){
throw err;
}
console.log(results[0].objid); // good
stuff_i_want = results[0].objid; // Scope is larger than function
console.log(stuff_i_want); // Yep. Value assigned..
}
Run Code Online (Sandbox Code Playgroud)
在更大的范围内
stuff_i_want = null
Run Code Online (Sandbox Code Playgroud)
关于返回mysql数据并将其分配给变量,我缺少什么?
============每个Alex建议的新代码
var parent_id = '';
get_info(data, cb){
var sql = "SELECT a from b where info = data"
connection.query(sql, function(err, results){
if (err){
throw err;
}
return cb(results[0].objid); // Scope is larger than function
}
Run Code Online (Sandbox Code Playgroud)
====新代码正在使用中
get_data(parent_recording, function(result){
parent_id = result;
console.log("Parent ID: " + parent_id); // Data is delivered
});
Run Code Online (Sandbox Code Playgroud)
然而
console.log("Parent ID: " + parent_id);
Run Code Online (Sandbox Code Playgroud)
在函数外部的范围内,parent_id为null
Ale*_*lex 14
您将需要了解异步调用和使用javascript的回调,这不是c#/ php等...
以下是使用您的代码的示例:
function get_info(data, callback){
var sql = "SELECT a from b where info = data";
connection.query(sql, function(err, results){
if (err){
throw err;
}
console.log(results[0].objid); // good
stuff_i_want = results[0].objid; // Scope is larger than function
return callback(results[0].objid);
}
}
//usage
var stuff_i_want = '';
get_info(parm, function(result){
stuff_i_want = result;
//rest of your code goes in here
});
Run Code Online (Sandbox Code Playgroud)
当你调用get_info它时,调用connection.query,它接受一个回调(那就是什么function(err, results)是
范围然后传递给这个回调,依此类推.
欢迎来到javascript回调地狱......
当你掌握它时,它很容易,只需要习惯一点,来自C#之类的东西
Ken*_*ram 13
五年后,我对异步操作有了更好的理解。另外,使用 ES6 中 async/await 的新语法,我重构了这段特定的代码:
const mysql = require('mysql2') // built-in promise functionality
const DB = process.env.DATABASE
const conn = mysql.createConnection(DB)
async function getInfo(data){
var sql = "SELECT a from b where info = data"
const results = await conn.promise().query(sql)
return results[0]
}
module.exports = {
getInfo
}
Run Code Online (Sandbox Code Playgroud)
然后,无论何时需要这些数据,我都会将其包装在异步函数中,根据getInfo(data)需要调用并使用结果。
我想您在这里真正想做的是返回一个Promise对象及其结果。这样,您就可以处理从DBMS检索数据的异步操作:获得结果后,就可以利用Promise resolve函数以某种方式“返回值” /“解决承诺”。
这是一个例子:
getEmployeeNames = function(){
return new Promise(function(resolve, reject){
connection.query(
"SELECT Name, Surname FROM Employee",
function(err, rows){
if(rows === undefined){
reject(new Error("Error rows is undefined"));
}else{
resolve(rows);
}
}
)}
)}
Run Code Online (Sandbox Code Playgroud)
在呼叫方,您可以使用该then功能来管理实现,并使用该catch功能来管理拒绝。
这是一个使用上面的代码的示例:
getEmployeeNames()
.then(function(results){
render(results)
})
.catch(function(err){
console.log("Promise rejection error: "+err);
})
Run Code Online (Sandbox Code Playgroud)
在这一点上,您可以为您的结果设置视图(实际上是作为对象数组返回的):
render = function(results){ for (var i in results) console.log(results[i].Name) }
Run Code Online (Sandbox Code Playgroud)
编辑
我将添加一个有关如何返回带有结果的HTML内容的基本示例,这是Node的一种典型情况。只需使用Promise的then功能来设置HTTP响应,然后在http:// localhost:3001上打开浏览器
require('http').createServer( function(req, res){
if(req.method == 'GET'){
if(req.url == '/'){
res.setHeader('Content-type', 'text/html');
getEmployeeNames()
.then(function(results){
html = "<h2>"+results.length+" employees found</h2>"
html += "<ul>"
for (var i in results) html += "<li>" + results[i].Name + " " +results[i].Surname + "</li>";
html += "</ul>"
res.end(html);
})
.catch(function(err){
console.log("Promise rejection error: "+err);
res.end("<h1>ERROR</h1>")
})
}
}
}).listen(3001)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24316 次 |
| 最近记录: |