【发布时间】:2020-02-25 10:16:38
【问题描述】:
根据我阅读this问题后的理解,require(ModuleName)是一个同步操作。
在register-rmq.js我写了以下内容:
const amqp = require('amqplib/callback_api');
function main(){
return new Promise(function(resolve,reject){
amqp.connect('localhost:5672', function(error0, connection) {
if (error0) {
throw error0;
}
connection.createChannel(function(error1, channel) {
if (error1) {
reject(error1);
}
channel.assertQueue('', {
exclusive: true
}, function(error2, q) {
if (error2) {
reject(error2);
}
});
resolve(channel); //
});
});
})
}
main().then(function(result){
module.exports = {result}
})
在我的controller.js 我有以下两行代码:
var channel = require('./register-rmq');
console.log(channel);
我对代码的期望是,在contoller.js 中需要模块之后的行给了我我期望从我需要的模块中得到的对象,但是我在controller.js 中拥有的console.log在promise 返回之前执行,因此控制器中的channel 对象为空。
我写的代码错了吗?还是我对在这种情况下的操作方式感到困惑?
【问题讨论】:
-
我从未见过有人在 promise 回调中定义
module.exports,我什至不确定那会做什么。第一次需要该文件时它不会工作,但我不确定是否有可能在以后的某个文件中需要它,并让它工作...... -
@TKoL 这是一个节点环境,它总是一个空对象。
-
@TKoL,谢谢,你是对的。我不知道导出它的正确方法,我认为这样做的正确位置是在回调中。
-
@George 实际上我刚刚测试过它,但事实并非如此。它并不总是一个空对象。如果您在 30 秒的 promise 回调后在一个文件中定义
module.exports,并且在不同的 30 秒 promise 回调后需要另一个文件中的该文件,它实际上在第二个文件中有效! -
显然这不是正确的方法,但可能需要异步定义模块导出。
标签: javascript node.js