javascript - 在另一个方法内部调用后异步方法显示没有进度
问题描述
我有node-js
db.js
一个类,它返回我一个数据数组。
//db.js
const mysql = require('mysql');
var subscribed = [];
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '',
database: 'mydb'
});
connection.connect((err) => {
if (err) throw err;
console.log('DB Connected!');
});
async function getTopics(subName) {
var qry = `SELECT topic_name from table where topic_name='${subName}'`;
await connection.query(qry, (err,rows) => {
if(err) throw err;
rows.forEach( (row) => {
subscribed.push(row.topic_name);
return subscribed;
});
});
}
module.exports.getTopics = getTopics;
在我mqtt
在以下代码中使用的另一个类中-请参阅里面的注释
//sub.js
var mqtt = require('mqtt')
var Broker_URL = 'mqtt://test.mosquitto.org';
var client = mqtt.connect(Broker_URL)
const db = require('./db');
const subName = 'iPhoneX';
var subscribed = [];
async function getTopics(){
subscribed = await db.getTopics(subName);
}
client.on('connect', function () {
console.log('connect') // no progress after this point. stops here
getTopics(); // calling above function here to get topics
subscribed.forEach(element => {
client.subscribe(element);
console.log(element);
});
})
client.on('message', function (topic, message) {
console.log(topic, '------>', message.toString());
})
解决方案
您不应将错误优先回调和async/await
. 它们是处理异步流的不同技术,它们不能一起工作。
使用其中一个,最好是后者,因为它更具可读性和易于使用。
async function getTopics(subName) {
var qry = `SELECT topic_name from table where topic_name='${subName}'`
// Convert `connection.query` to a `Promise` so we can properly
// await it.
const rows = await new Promise((resolve, reject) => {
connection.query(qry, (err, rows) => {
if (err) return reject(err)
resolve(rows)
})
})
return rows.map(row => row.topic_name)
})
从那时起,如果一个函数被标记为async
需要对其进行await
编辑以使其结果在下一行中可用:
client.on('connect', async function () {
const topics = await getTopics()
console.log(topics)
})
如果你打算使用async/await
你可能想要使用mysql2
它,它会返回 Promises。您只能async/await
在返回 Promises 的函数上使用。
推荐阅读
- python - 需要洞察力来理解 python 中的字符串
- drupal-8 - Drupal composer install:您的需求无法解析为一组可安装的软件包
- reactjs - 无法在反应本机应用程序中使用 react-navigation-tabs 给出未找到模块的问题?
- c++ - 在 C++ 中用整数填充固定大小的 char 数组
- eclipse - 无法在 Eclipse 中为 C/C++ 插入波浪号
- python - 确保至少安装了一个额外的 Python 包
- java - Spring Cloud 流:Kafka Sink 获取备用消息
- angular - 如何使用动画更改角度 ngfor 元素顺序
- shell - 基于条件的查找和替换 csv 文件字段中的值
- asp.net-mvc - 将参数传递给会话 MVC EF