node.js - Nodejs等待不等待
问题描述
await
我有一个使用 await 的简单 MongoDbB 示例,但由于某种原因,当我使用关键字时代码不会等待...
index.js
:
require('dotenv').config()
const utilFunctions = require('./functions')
const getKeywords = utilFunctions.getKeywords
const main = async () => {
const keywords = await getKeywords(process.env.MONGO_URI)
console.log('keywords: ', keywords)
}
main()
和functions.js
:
var MongoClient = require('mongodb').MongoClient;
const getKeywords = async (uri) => {
console.log('uri is: ', uri)
MongoClient.connect(uri, function (err, db) {
if (err) throw err;
console.log('connected...')
var dbo = db.db("eon-data")
dbo.collection("twitter-keyword-scanner").find({}).toArray(function (err, mainDoc) {
if (err) throw err;
const keywords = mainDoc[0].config.keywordsToLookFor
console.log('got keywords: ', keywords)
db.close()
return keywords
})
})
}
module.exports = {
getKeywords
}
当我运行时,node index.js
我得到这个输出:
uri is: (my mongo uri)
(node:23990) DeprecationWarning: current Server Discovery and Monitoring engine is deprecated, and will be removed in a future version. To use the new Server Discover and Monitoring engine, pass option { useUnifiedTopology: true } to the MongoClient constructor.
keywords: undefined
connected...
got keywords. [
(data in the db)
]
由于某种原因,异步/等待不起作用......
它确实在日志中打印关键字“得到关键字:”,但在 index.js 中它正在打印“关键字:未定义”并在“getKeywords”返回之前打印它......
我希望 console.log 在函数getKeywords
返回后发生,但实际上它是预先运行的。我在这里做错了吗?谁能看到为什么 async/await 不能正常工作?
谢谢!
PS-你可以在这里找到完整的项目:https ://github.com/JimLynchCodes/Ameritrader-Bots/tree/master/twitter-keyword-scanner
使用节点 v12.16.1 运行它
解决方案
在我将整个回调包裹在其中之后,new Promise
它终于正常工作了:
functions.js
:
var MongoClient = require('mongodb').MongoClient;
const getKeywords = async (uri) => {
console.log('uri is: ', uri)
return new Promise((resolve, reject) => {
MongoClient.connect(uri, function (err, db) {
if (err) throw err
console.log('connected...')
var dbo = db.db("eon-data")
dbo.collection("twitter-keyword-scanner").find({}).toArray(function (err, mainDoc) {
if (err) throw err
const keywords = mainDoc[0].config.keywordsToLookFor
console.log('got keywords. ', keywords)
db.close()
resolve(keywords)
})
})
})
}
在阅读了“MongoClient.connect”的 mongo 文档后,我可以看到这个连接函数返回null而不是 Promise ......所以我想实际上没有办法用“new Promise”包装它(也许有另一种选择除了“MongoClient.connect”之外的连接语法,它在连接时返回一个承诺。如果你知道,请发表评论!)
推荐阅读
- python - 如何将已解析语句的列表转换为可在 if 语句中使用的列表或字符串?
- python - Python:从另一个函数调用一个函数
- vba - 在 VBA 函数中存储查找表
- javascript - 伊朗的 Chrome 地理位置
- java - Java - URLConnection 返回错误代码 500
- android - 从实时数据库播放 URL 到 Exoplayer
- python-3.x - 无论如何,一次可以使多个虚拟变量可变吗?
- apache-spark - Cloudera 升级到 5.16.1 后 Spark 作业失败
- botframework - 从网络聊天直线向 MS bot 发送自定义数据
- laravel - 为什么不在特使上使用带有变量的 shell 命令?