1. 程式人生 > >Node.js 回撥函式來解決SQL語句與返回值的非同步問題

Node.js 回撥函式來解決SQL語句與返回值的非同步問題

    作為一個剛剛接觸Node的菜鳥,面對Node的非同步問題著實是頭大。最近做一個前端的分頁問題,原始碼是順序執行兩條sql語句然後返回:

       client.query(  //第一個sql
	
	  'SELECT * FROM products' ,
	  function selectCb(err, results, fields) { 
		if (err) {  
		  throw err;  
		}  
		  
		  if(results)
		  {
			  len=0;
			  for(var i = 0; i < results.length; i++)
			  {
				   len = len+1;
			  }
		  }    
	  }  
	);
       client.query(  //第二個sql
	  'SELECT * FROM products where id>'+(page-1)*size+' and id<='+page*size,  
	  function selectCb(err, results, fields) {  
		if (err) {  
		  throw err;  
		}  
		  
		  if(results)
		  {
			  data = [];
			  for(var i = 0; i < results.length; i++)
			  {
				  data[i] = {id:results[i].id, image:results[i].image};
				  console.log("%d\t%s", results[i].id, results[i].image);
				  
			  }
		  }
	  }  
	);
        response.writeHead(200, {'Content-Type': 'text/plain','Access-Control-Allow-Origin':'*'});
	str = " {\"records\": ";
	str += JSON.stringify(data);  //此處為一個[]陣列

	str += ",\"len\": ";
	str += len;
	str += ",\"status\": ";
	str += 1;
	str += "}";
	response.end(str);

    但實際上,結果是Node先返回了response,然後執行的sql語句。

    後來通過查閱,初步瞭解了通過回撥函式來實現同步,修改程式如下:

client.query(  //第一個sql
	  'SELECT * FROM products' ,
	  function selectCb(err, results, fields) { 
		if (err) {  
		  throw err;  
		}  
		  
		if(results)
		{
			  len=0;
			  console.log("client.query1");
			  for(var i = 0; i < results.length; i++)
			  {
				   len = len+1;
			  }
		}
		client.query(  //第二個sql
			'SELECT * FROM products where id>'+(page-1)*size+' and id<='+page*size,  
			  function selectCb(err, results, fields) {  
				if (err) {  
				  throw err;  
				}  
				  
				if(results)
				{
					  data = [];
					  for(var i = 0; i < results.length; i++)
					  {
						  data[i] = {id:results[i].id, image:results[i].image};
						  console.log("%d\t%s", results[i].id, results[i].image);
						  
					  }
				}    

				response.writeHead(200, {'Content-Type': 'text/plain','Access-Control-Allow-Origin':'*'});
				str = " {\"records\": ";
				str += JSON.stringify(data);  //此處為一個[]陣列

				str += ",\"len\": ";
				str += len;
				str += ",\"status\": ";
				str += 1;
				str += "}";
				response.end(str);
		});
	});
    程式可以按照原次序執行了。