请教一个操作数据库的异步问题
发布于 3年前 作者 sivansu 931 次浏览

请教一个操作数据库的异步问题 如题,请问各位大大:

我现在有一个数据库的操作,封装在一个函数例如myfunc里面,执行myfunc会往数据库插入数据,现在有一个程序段代码大概如下:

==================================================================== //代码段如下:

 myfunc( someData); //往数据库插入data数据, 数据较多,会执行很多次插入操作,且耗时较久

  /* 紧接着myfunc的一些代码*/
  ............
   ............
  response.write('xxxxx')

====================================================================

请问: 在不使用数据库的回调函数的操作下,如何让myfunc后的代码在myfunc执行后才执行?

myfunc的代码可以类似以下:

function myfunc( someData){
    /* 省略处理代码 */
   for(  /*循环条件*/ ){
     mysql.query(' INSERT INTO XX (field1, field2) VALUES( xx,   yy ) ',
           function(err,ret){ }
     );
   }
}
10 回复

木有其他办法了 除非你用一些异步处理框架,实际上都是用回调

如果是用回调的话,又不影响现有代码的执行顺序,请问有什么法子? 我想用一个变量做标识, 请问可行不?

我现在尝试了把myfunc封装到一个类里,再继承系统的Emitter类, 然后在数据库的回调函数里注册事件,但是这样只能标识一次数据库操作是否结束,无法判断全部操作是否结束

看来新人还不少。 使用的话可以看以下几个模块 async 、EventProxy、Jscex,学习的话看看前两个里面代码的实现也是不错的。Jscex 可以看看编译后的代码。

的确是新人哎,刚学了一个星期不到~

@sivansu 使用回调也很简单呀:

for(  /*循环条件*/ ){
(function(i){ //这里使用闭包来保存变量i
    //code...
})(i);

}

@italkboy

//Like this:
function myfunc(someData){
/* 省略处理代码 */
for(  /*循环条件*/ ){
    (function(i){ //这里使用闭包来保存变量i
        mysql.query(' INSERT INTO XX (field1, field2) VALUES( xx,   yy ) ',
            function(err, ret){
                if(i == ret.length - 1){
                //在这里所有数据库操作完成
                }
            }
        );
    })(i);
}
}

其实用计数也很简单,在每次成功插入的回调里+1,并同时判断是否完成,若完成执行后面代码

@italkboy 嗯嗯,明白了哈。

你的for要是太大的话,会出现错误的,类似这个

嗯嗯,用计数是一个办法。 看来要保证node里面代码的同步也只有回调跟计数两张办法了

回到顶部