Node.js 回撥函式來解決SQL語句與返回值的非同步問題
阿新 • • 發佈:2019-01-06
作為一個剛剛接觸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); }); });