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

Javascript 从node.js中的回调函数获取result.insertId,javascript,node.js,callback,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 IN

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

我有以下代码:

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的函数,但我还没有找到一种方法

我试图在回调函数中设置一个全局变量,但是当我试图访问它时,它的值仍然没有改变

有没有一种方法可以让我直接访问回调函数中的值,或者让回调函数在调用时通知我,然后返回值

编辑:

在测试了这里提出的每个解决方案以及我在别处搜索发现的解决方案之后,唯一对我有效的方法(不使用外部模块使代码以“同步”而不是“异步”方式运行)是在回调本身内部实现我想要的逻辑,这是我首先要避免的,但无论我做什么,我都无法解决这个问题。
是的,“通知我”是一种方式:

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在这里也没有多大帮助,因为回调函数不是在堆栈框架下执行的,而是从事件循环外部调用的。您需要使用域/或类似类型的异步错误处理

是的,“通知我”是一种方法:

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在这里也没有多大帮助,因为回调函数不是在堆栈框架下执行的,而是从事件循环外部调用的。您需要使用域/或类似类型的异步错误处理

是的,“通知我”是一种方法:

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在这里也没有多大帮助,因为回调函数不是在堆栈框架下执行的,而是从事件循环外部调用的。您需要使用域/或类似类型的异步错误处理

是的,“通知我”是一种方法:

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在这里也没有多大帮助,因为回调函数不是在堆栈框架下执行的,而是从事件循环外部调用的。您需要使用域/或类似类型的异步错误处理

我认为有一种方法可以通过无休止的循环等待响应,也许您也可以使用上下文来分配变量,如下所示:

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

我还没有在我的机器上测试过这段代码,请测试它并告诉我是否有任何错误。

我认为有一种方法可以通过无休止的循环等待响应,也许您也可以使用上下文来分配变量,如下所示:

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

我还没有在我的机器上测试过这段代码,请测试它并告诉我是否有任何错误。

我认为有一种方法可以通过无休止的循环等待响应,也许您也可以使用上下文来分配变量,如下所示:

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

我还没有在我的机器上测试过这段代码,请测试它并告诉我是否有任何错误。

我认为有一种方法可以通过无休止的循环等待响应,也许您也可以使用上下文来分配变量,如下所示:

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;
}
我还没有在我的机器上测试此代码,请测试它并告知是否有任何错误。

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) 
}
--- 老答案:在测试了这里提出的每个解决方案以及我在别处搜索发现的解决方案之后,唯一对我有效的方法(不使用外部模块使代码以“同步”而不是“异步”方式运行)是在回调本身内部实现我想要的逻辑,这是我首先要避免的,但无论我做了什么,我都无法解决这个问题。

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) 
}
--- 老答案:在测试了这里提出的每个解决方案以及我在别处搜索发现的解决方案之后,唯一对我有效的方法(不使用外部模块使代码以“同步”而不是“异步”方式运行)是在回调本身内部实现我想要的逻辑,这是我首先要避免的,但无论我做了什么,我都无法解决这个问题。

2年后:

在对node.js和异步代码有了更多的经验之后,我发现这个问题是多么幼稚,尽管当时我无法理解,这一点在我使用try/catch块处理异步调用时也很明显,而异步调用对异步代码没有用处,在异步代码中,错误处理是通过检查来完成的