搜尋

首頁  >  問答  >  主體

node.js - nodejs怎么同步从一个数据库查询函数中返回一个值?

我想把从数据库中查询得到的值储存到一个变量中然后打印出来,但数据库查询是异步的,打印函数总是先一步调用,查询函数后一步调用,打印出来的值是空的。下面是代码。

var sqlite3 = require('sqlite3').verbose();


var async = require('async');


var str = "";

var db = new sqlite3.Database('score.db', function () {
    db.all("select * from score", function (err, res) {
        if (!err) {
           // console.log(JSON.stringify(res));
            str = JSON.stringify(res);
            console.log(str);//@1 这里输出的是有值的str
        }else {
            console.log(err);
        }
    });
});

console.log(str+"jjjj");//@2 这里输出的Str,是没有值的空的

下面是输出结果:
jjjj 这是@2console打印的,Str是空的

[{"id":1,"name":"jim","score":"100"},{"id":2,"name":"tom","score":"200"}]
这是@1 console打印的,str是有值的。

请问怎样让查询回调先执行,让str获得值,传递出来,然后再执行最后一句@2的打印语句。javascript的异步回调真令人头痛啊,一直不知道怎么解决。

ringa_leeringa_lee2768 天前764

全部回覆(3)我來回復

  • 高洛峰

    高洛峰2017-04-17 11:33:33

    恭喜進入callback大坑

    var sqlite3 = require('sqlite3').verbose();
    
    
    var async = require('async');
    
    
    var str = "";
    
    var get_result = function(callback) {
        var db = new sqlite3.Database('score.db', function () {
            db.all("select * from score", function (err, res) {
                if (!err) {
                    callback(JSON.stringify(res));
                    console.log(str);//@1 这里输出的是有值的str
                }else {
                    console.log(err);
                }
            });
        });
    }
    
    get_result(function(data){
        console.log(data)
    })
    

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-17 11:33:33

    在你的這個例子裡,只能把列印結果的那句放到回呼函數裡,總之在 Node.js 就不要想讓程式碼線性執行了。

    推薦一本有關 JavaScript 非同步流程控制的書:JavaScript 非同步程式設計.

    • 有一些函式庫可以讓程式碼看起來更線性一些,例如 async, promise, co, 具體參見上面的書的附錄部分。
    • 有一些資料庫驅動實作了同步的資料庫查詢,不過這種函式庫基本上不可能在生產環境使用,因為會阻塞其他的事件。

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 11:33:33

    你可以試試這種方法:

    var sqlite3 = require('sqlite3').verbose();
    
    function selectFromDB(dbName, operation, callback) {
        var db = new sqlite3.Database(dbName, function () {
            db.all(operation, function (err, res) {
                if (!err) {
                    str = JSON.stringify(res);
                    return callback(null, str);
                } else {
                    return callback(err);
                }
            });
        }); }
    
    selectFromDB("score.db", "select * from score", function (err, result){
        if (err) {
            console.log(err);
        }
        else {
            console.log(result + "jjjj");
        } 
    });
    

    回覆
    0
  • 取消回覆