node.js继续执行,无需等待require完成。

时间:2015-06-20 00:13:23

标签: node.js asynchronous requirejs

我正在尝试访问所需节点文件中的变量。但是,需要它的文件总是在不等待设置变量的情况下继续。如何在继续之前让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.coffee中的记录变量了。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

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

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

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

albums 而不是记录中导出db.coffee本身会更有意义。

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)
);