从node.js中的回调函数获取result.insertId

时间:2014-06-06 11:40:55

标签: javascript node.js callback

在其他答案下面查看我的更新答案。问题变得非常简单,我只是不明白异步是如何工作的或应该在发布时处理

我有以下代码:

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>     

  

3 个答案:

答案 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;
}

我没有在我的机器上测试过这段代码,请测试一下,如果有任何错误请告诉我。