【问题标题】:node.js continues execution without waiting for a require to complete.node.js 继续执行而不等待 require 完成。
【发布时间】:2015-06-20 08:57:52
【问题描述】:

我正在尝试访问所需节点文件中的变量。但是,需要它的文件始终会继续运行,而无需等待设置变量。如何让 app.coffee 在继续之前等待?

我有两个文件:

db.coffee:

databaseUrl = 'mongodb://localhost/db'
mongoose = require('mongoose')
mongoose.connect(databaseUrl)

db = mongoose.connection
records = []

db.on('error', console.error.bind(console, 'connection error:'))

db.once('open', () -> 
        console.log('Connected to database: ', databaseUrl)
    )

schema = new mongoose.Schema({play_counts: {type: Number}, album_name: {type: String }})

albums = mongoose.model('albums', schema)

albums.find({}, {}, (err, data) ->
        if err?
            console.log("Error: failure to retrieve albums.")
            return
        else
            records = data
    )

console.log(records)

module.export = records

和 app.coffee:

db = require('./db')

console.log(db)

当我运行 app.coffee 时,我会从控制台登录 app 得到 [] 的输出,然后是 db.coffee 的输出,即使调用了 require。

让应用程序在继续之前等待 db 完成的最佳方法是什么,以便我可以访问 db.coffee 中的记录变量。感谢您的帮助。

【问题讨论】:

标签: node.js asynchronous requirejs


【解决方案1】:

在某种意义上db.coffee已经完成了。该文件中的所有代码都已执行。

这只是你想要的,records 尚不可用,因为负责获取它的函数 albums.find 接受第三个参数 (err, data),这是一个函数,当猫鼬有实际上在数据库中找到了您的记录。这是一个磁盘操作,所以这就是 Nodejs 的异步特性大放异彩的地方,因为它使您能够“继续”并在 mongoose 获取所述数据时继续执行其他事情。

所以实际上,你不想依赖 db.coffee 完成,你真正想要等待的是你的 albums.find 函数调用你作为第三个参数传递它的回调 - (err, data)

从您的 db.coffee 中导出 albums 本身比从记录中导出更有意义。

albums = mongoose.model('albums', schema)
module.export = albums;

然后在您的 app.coffee 中,您将执行获取/查找记录:

albums = require('./db')
albums.find({}, {}, (err, data) ->
    if err?
        console.log("Error: failure to retrieve albums.")
        return
    else
        console.log(records)
);

【讨论】:

  • @lagginreflex 如果我按照此处显示的方式格式化代码,这仍会返回 {},您在此处显示的 app.coffee 中的专辑仍显示为未定义。有什么建议吗?
  • @NNNNNNNNNNDelicious 你能用你当前的确切代码更新你的问题吗?
  • 您的解决方案确实有效,我只是错误地使用了导出,谢谢!
猜你喜欢
  • 2021-05-06
  • 1970-01-01
  • 2020-06-24
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
相关资源
最近更新 更多