我的异步函数中的sqlite请求也是异步的吗?

时间:2018-01-30 13:42:16

标签: node.js sqlite

我正在使用node.js和npm的sqlite包以及discord.js制作不和谐机器人。

我尝试从包含sqlite请求的异步函数中获取数组。

看起来我的sqlite请求也是异步的,因为我在执行请求之前得到了空响应。我如何形成我的请求以先执行它?

我已经阅读过这篇文章:How do I return the response from an asynchronous call?但我还是不明白。这不是重复的,因为链接中的问题是关于ajax并且对我没什么帮助。我希望如果我用自己的代码看到它,我就能更好地理解它。

这就是我现在所拥有的。我已经尝试了没有结果的回调。

承诺方法:

这是dbHandler.js中的异步功能。

  var Promise = require("bluebird");

  getList: function(userID) {
     return new Promise(function(resolve, reject) {
        var array = [];
        sql.each(`SELECT * FROM table WHERE userID = ?`, userID, (err, row) => {
           if (err) {
           return console.error(err);
        } else {
           console.log("row: " + row + " element: " + row.username);
           array.push(row);
        }
    });

    array.forEach(function(element) {
       console.log("element: " + element.username);
    });

    console.log("array: " + array);
       resolve(array);
    });
  }

这是我在list.js的电话。

  db.getList(uid)
  .then(function(v) {
      console.log("size: " + v.size);
  })
  .catch(function(v) {
      console.log("failed: " + v);
  });

在控制台中我明白了。

  array:
  size: undefined
  row: [object Object] element: user1
  row: [object Object] element: user2
  row: [object Object] element: user3

回调方法:

dbHandler.js

 getList: function(userID, callback) {
     var array = [];

     sql.each(`SELECT * FROM warns WHERE userID = ?`, userID, (err, row) => {
        if (err) {
           return console.error(err);
        } else {
           array.push(row);
        }
     });

     if (array) {
        callback("", array);
     } else {
        callback("error", "");
     }
 },

list.js

 db.getList(uid, function (err, response) {
    if (err) {
       console.log(err);
    } else {
       console.log(response.size);
    }
 });

使用回调方法我只在控制台中获得undefined

1 个答案:

答案 0 :(得分:0)

因为您得到以下输出:

row: [object Object] element: user1
row: [object Object] element: user2
row: [object Object] element: user3

我只能假设您从数据库中获得结果,但访问它是个问题。我建议您在决定如何访问它之前尝试转储整个对象并查看它的结构。

下面我修改了你的代码以转储对象的可读版本。从那里开始并进行调试。

    getList: function(userID) {
         return new Promise(function(resolve, reject) {
            var array = [];
            sql.each(`SELECT * FROM table WHERE userID = ?`, userID, (err, row) => {
               if (err) {
               return console.error(err);
            } else {
               console.log(JSON.stringify(row)); //lets get the contents of the row object
               array.push(row); console.log(JSON.stringify(array)); //also, lets know what array contains after adding all the rows
            }
        });