回调召回本身

时间:2012-07-20 22:07:32

标签: javascript node.js express

我有一个函数可以在一个数据库中插入一个随机数作为主键。

我有一个问题,当数字已经在数据库中我想再次调用该进程来更改数量并尝试再次插入但我是Javascript的新手所以这是我到目前为止所提出的代码

创建随机数的函数:

编辑2:

function crearNumero()
{ 
    var aNumeros = new Array
    (
        '1', '2', '3','4','5','6','7','8','9'
    ); 
    var cNumero = aNumeros[Math.floor(Math.random()*aNumeros.length)]; 


    return cNumero;
} 

插入数据库的函数:

function insertarNumero(Callback)
{
  var sql='INSERT INTO tabla_numero(numero) VALUES(?)';
  var params= [crearNumero()];

  client.query(sql,params,function(err,rows)
  {
    if(err){
      arguments.callee(Callback);
    } else {
      return Callback(params[0]);
    }
  });
} 

所以我尝试用这个插入数字:

insertarNumero(function(args)
     {
       console.log('el numero ingresado fue '+args);
       console.log('the number inserted was '+args);
        });

此代码没问题但是当数字存在时我不知道如何重复处理。

任何人都可以告诉我如何解决这个问题吗?

3 个答案:

答案 0 :(得分:1)

一种可能性是自动增量而不是随机数。这会更舒服。

如果您确实要插入随机数,则应在unique index上创建numero。调用查询后,您可以检查查询是否成功,如果查询不成功,请检查是否因为该数字已经存在。 (检查mysql服务器返回的错误号。)如果失败,则创建一个新的随机数并再次调用您的函数以插入新号码。

PS:目前,您只能在数据库中存储九行。

答案 1 :(得分:1)

您希望实际将回调函数传递给insertarNumero函数,如下所示:

function anotherInsert() {
    insertarNumero(crearNumero(), anotherInsert);
}

如果失败,这将导致insertarNumero函数重新调用此函数。请注意,您可能还应检查错误代码,以便在出现连接错误时不要尝试多次插入。

修改:看到您仍然无法解决问题,以下是两种可能对您有所帮助的选择:

function insertarNumero(callback) {
    var sql = 'INSERT INTO tabla_numero(numero) VALUES(?)';
    var params = [crearNumero()];

    client.query(sql, params, function(err, rows) {
        if (err) {
            callback(err);
        } else {
            callback();
        }
    });
}

function insert() {
    insertarNumero(function(err) {
        if (err) {
            console.log('failed to insert');
            insert();
        } else {
            console.log('inserted');
        }
    });
}

如果你真的不想要insert()功能......

function insertarNumero(callback) {
    var sql = 'INSERT INTO tabla_numero(numero) VALUES(?)';
    var params = [crearNumero()];

    client.query(sql, params, function(err, rows) {
        if (!err) {
            if (callback) {
                callback(params[0]);
            }
        } else {
            //TODO: Check the error code
            insertarNumero(callback);
        }
    });
}

insertarNumero(function(args) {
    console.log('the number inserted was ' + args);
});

答案 2 :(得分:-1)

再次调用自己并使用arguments.callee传递相同的回调:

function insertarNumero(Callback)
{
  var sql='INSERT INTO tabla_numero(numero) VALUES(?)';
  var params= [crearNumero()];

  client.query(sql,params,function(err,rows)
  {
    if(err){
      arguments.callee(Callback);
    } else {
      return Callback();
    }
  });
} 

arguments.callee与使用此函数的名称insertarNumero

相同