请教一个操作数据库的异步问题
发布于 12 年前 作者 sivansu 4718 次浏览 最后一次编辑是 8 年前

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

我现在有一个数据库的操作,封装在一个函数例如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){ }
     );
   }
}
9 回复

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

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

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

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

@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里面代码的同步也只有回调跟计数两张办法了

回到顶部