在其他答案下面查看我的更新答案。问题变得非常简单,我只是不明白异步是如何工作的或应该在发布时处理
我有以下代码:
function qcallb(err,result){
console.log("result.insertID:"+result.insertId);
return result.insertId;
}
var createRecord= function (tableName,record){
try{
queryStatment="INSERT INTO " + tableName + " SET ?";
var result='';
var query = connection.query(queryStatment, record, qcallb,false);
}
catch(err){
return 0;
}
return iid;
}
我想将回调函数中的变量result.insertId
返回给调用create record的函数,但我还没有找到办法。
我试图在回调函数中设置一个全局变量,但是当我尝试访问它时,它的值仍然保持不变。
有没有办法让我直接在回调函数中访问该值,或者在调用函数时让回调函数通知我然后返回值?
编辑:
在这里测试了每个提出的解决方案,以及通过搜索其他地方找到的解决方案之后,唯一对我有用的东西(不使用外部模块来制作一段代码,而不是&而不是& #39; async&#39;),是在回调本身内实现我想要的逻辑,这是我想要首先避免的,但无论我做什么,我都无法解决它。< / H2>
答案 0 :(得分:1)
2年后:
在获得了更多关于node.js和异步代码的经验之后,我看到这个问题是多么天真,虽然它当时超出了我的范围,这在我使用围绕异步调用的try / catch块时也是显而易见的。对异步代码没有用处,其中处理错误是通过在回调中检查err
并在其存在时对其进行操作来完成的。
由于它似乎有很多观点,对于那些新引入异步开发的人来说,这似乎是一个反复出现的问题。
这不能在问题中提到的意义上完成,因为在异步操作之后进行操作并使用由异步操作产生的值,它必须从回调中调用具有该值的异步操作。
要解决此问题,可以将代码修改为:
function doSomethingWithResult(result) {
// query is done, and this would only be called if no error occurred
console.log('Result is: ', result)
// do whatever you want
}
function queryCallback(err,result) {
if (err) {
throw err
}
doSomethingWithResult(result)
}
function createRecord(tableName, record) {
queryStatment='INSERT INTO `' + tableName + '` SET ?'
connection.query(queryStatment, record, queryCallback)
}
旧答案:在这里测试了每个提出的解决方案,以及通过搜索其他地方找到的解决方案之后,唯一对我有用的东西(不使用外部模块来制作一段代码以'同步'而不是'异步'运行),是为了在回调本身内实现我想要的逻辑,这是我想要首先避免的,但无论我做什么,我都无法解决它。
答案 1 :(得分:0)
是的,'通知我'是要走的路:
var createRecord= function (tableName,record, cb){
var query = "INSERT INTO " + connection.escape(tableName) + " SET ?";
connection.query(query, record, function(err, res) {
if (err) return cb(err);
cb(null, res.insertId); // this is "notify me" part
});
}
// now use it
createRecord('blah', { foo: "bar" }, function(err, id) {
console.log(id);
});
此外,try / catch在这里没有多大帮助,因为回调函数不是在堆栈帧下执行,而是在事件循环外部调用。您需要使用domains / zones或类似的异步错误处理
答案 2 :(得分:0)
我认为有一种方法可以用无限循环等待响应,也许您也可以使用上下文来分配变量,如下所示:
var sleep = require('sleep');
var createRecord= function (tableName,record){
try{
queryStatment="INSERT INTO " + tableName + " SET ?";
var insertId=0;
var query = connection.query(queryStatment, record, function(err,result){
console.log("result.insertID:"+result.insertId);
insertId = result.insertId;
},false);
}
catch(err){
return 0;
}
while(insertId==0){
sleep.sleep(0.1); # sleep for 0.1 second
}
return insertId;
}
我没有在我的机器上测试过这段代码,请测试一下,如果有任何错误请告诉我。