【问题标题】:Async-Await Still running asynchronouslyAsync-Await 仍在异步运行
【发布时间】:2019-06-14 16:57:51
【问题描述】:

等待 Select * 函数,然后在打印完成后执行操作。 但是它在打印输出之后匆匆忙忙地完成了所有事情。所以它是这样的:调用 Await 函数,然后在调用 resolve 之前调用 await 之后的其他东西,然后打印出 await 函数。

老实说,我已经尝试了很多。制作匿名异步块以在函数内运行等待。我之前没有对函数使用 Promise,但后来添加它们认为我需要解决它们。但没有骰子。

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

var db = new sqlite3.Database(__dirname+'/requestLog.db');

test();
async function test(){
    await selectAll();

    console.log('test')
}

function selectAll(){
    return new Promise((resolve, reject) => {
        try {
            db.serialize(function() {   
                db.each("SELECT rowid AS id,* FROM requests", function(err, row) {
                    console.log(row);  
                });
                resolve()
            });
        } catch (error) {
            console.log(`Error With Select ALL(): \r\n ${error}`)
            reject();
        }
    });
 }

我确定只是我错过了一些荒谬的事情。 现在我觉得我正在进入一个兔子洞并转圈圈 请不要评判我哈哈

我想将数据库中的所有内容打印到控制台。然后在我打印后执行(“测试”)或任何操作。

但一切都在等待中运行

【问题讨论】:

  • resolve()移动到db.each()的回调中。否则它不会等待db.each() 完成。

标签: node.js sqlite promise async-await


【解决方案1】:

问题是resolve()db.each() 之后被调用,放置解析的正确位置是完整的回调:Database#each(sql, [param, ...], [callback], [complete]),来自文档。 https://github.com/mapbox/node-sqlite3/wiki/API#databaseeachsql-param--callback-complete

function selectAll() {
    return new Promise((resolve, reject) => {
        try {
            db.serialize(function () {
                db.each("SELECT rowid AS id,* FROM requests", function (err, row) {
                    console.log(row);
                },
                    (err, rowCount) => {
                        if (err) reject(err);
                        resolve(rowCount);
                    }
                );
            });
        } catch (error) {
            console.log(`Error With Select ALL(): \r\n ${error}`)
            reject();
        }
    });
}

【讨论】:

  • ayyy 做到了。非常感谢。 DB im 制作很简单,所以我按照自述文件中的用法示例进行操作。我没有注意到那部分。谢谢老兄。
【解决方案2】:

试试这个:

async function selectAll() {
    await  db.each("SELECT rowid AS id,* FROM requests", function (err, row) {
        console.log(row);
    });
}

【讨论】:

  • 你不需要命名函数,但你需要async标志。
  • db.each 在这个库中没有返回 Promise。这段代码不会有任何影响。
  • 感谢我尝试过,但它仍然会在打印之前记录该测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
  • 2017-10-26
  • 2019-05-10
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多