【问题标题】:Awaiting doesn't appear to be waiting for results in my functions等待似乎不是在等待我的函数中的结果
【发布时间】:2020-05-27 01:43:11
【问题描述】:

我知道这里有人问过这类问题,并且在发布这个问题之前我已经进行了广泛的研究。

我有七个操作需要按顺序运行。大多数都与数据库相关,因此可能需要一些时间才能完成。

  1. getLiveItems => puppeteer 页面(平均 10 秒)

  2. getOldItems => mySQL 查询

  3. getNewItems => mySQL 查询

  4. compareItems => lodash 比较

  5. saveOldItems => mySQL 插入查询

  6. saveNewItems => mySQL 插入查询

  7. notifyUser => puppeteer 打开页面

我知道我需要使用回调或承诺。但我什至无法使用任何一种方法完成前两个操作。

这是我最近的尝试。

var oldItems, newItems;


var getoldItems = async function(callback) {
    await connection.query('SELECT * FROM items', function(err, rows) {
        if (err) {
            throw err;
        } else 
            callback(null, rows);
    });
}

var getnewItems = async function(callback) {
    await connection.query('SELECT * FROM newItems', function(err, rows) {
        if (err) {
            throw err;
        } else 
            callback(null, rows);
    });
}



const init = async function(){

    await getoldItems(function(err, content) {
        if(err){
            console.log(err);

        } else {
            oldItems = content;
            return oldItems;
        }
    })

    await getnewItems(function(err, content) {
        if(err){
           // console.log(err);  
        } else {
            newItems = content;
            return newItems;
        }
    })

    return;

}

( async function() {
 await init();
 console.log(oldItems);
 console.log(newItems);   
});

我没有输出。也没有错误。

我真的很困惑。我已经阅读并阅读了有关此主题的内容,但是我缺少一些基本的东西。

这就是我的思想处理我的脚本的方式,因此我这样写它的原因......

我将等待 init 函数的结果,它执行 下面...

我将等待 getOldItems 的结果,然后继续 等待getNewItems的结果。然后,我要回去了 返回 Init 并控制台输出这两个结果。

我错过了什么?!

提前谢谢你。

在佛罗里达感到沮丧, 约翰

【问题讨论】:

  • 您使用的是回调,而不是 Promise,因此您的 await 实际上并没有在那里做任何事情。我只是在这里猜测,您使用的是 mysql npm 包吗?你有几个选择:切换到所有回调,用 Promises 包装你的回调,使用原生支持 Promises 的数据库库
  • 是的,我正在使用 mysql 包。如果我使用承诺,尽管对我来说是新闻,哈哈,我需要在某个地方解决一些问题,不是吗?
  • 正如已经说过的,await 只有在你 await 承诺时才会做一些有用的事情。你的 mysql 版本不做承诺,所以你不能直接使用await。我建议切换到mysql2,它内置了承诺支持,如here 所示。然后你不能传递一个回调,它会返回一个你可以使用await的promise来获得结果。
  • 这就是我要找的! MySql2.感谢您的建议。如果您可以发布作为答案,我会接受,因为这解决了我的问题。

标签: javascript node.js asynchronous async-await


【解决方案1】:

您使用的是回调,而不是 Promise,因此您的 await 实际上并没有做任何事情。
你有几个选择: - 切换到所有回调 - 用 Promises 包装你的回调 - 使用原生支持 Promises 的 db 库

一些支持 Promise 的 mysql 库:
https://www.npmjs.com/package/mysql2
https://www.npmjs.com/package/promise-mysql

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 2019-12-08
    • 2019-01-18
    • 1970-01-01
    相关资源
    最近更新 更多