【问题标题】:NodeJS - requiring module is not working synchronouslyNodeJS - 需要模块没有同步工作
【发布时间】: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.logpromise 返回之前执行,因此控制器中的channel 对象为空。

我写的代码错了吗?还是我对在这种情况下的操作方式感到困惑?

【问题讨论】:

  • 我从未见过有人在 promise 回调中定义 module.exports,我什至不确定那会做什么。第一次需要该文件时它不会工作,但我不确定是否有可能在以后的某个文件中需要它,并让它工作......
  • @TKoL 这是一个节点环境,它总是一个空对象。
  • @TKoL,谢谢,你是对的。我不知道导出它的正确方法,我认为这样做的正确位置是在回调中。
  • @George 实际上我刚刚测试过它,但事实并非如此。它并不总是一个空对象。如果您在 30 秒的 promise 回调后在一个文件中定义 module.exports,并且在不同的 30 秒 promise 回调后需要另一个文件中的该文件,它实际上在第二个文件中有效!
  • 显然这不是正确的方法,但可能需要异步定义模块导出。

标签: javascript node.js


【解决方案1】:

您已经强调了导出模块是同步完成的;你不能等到 promise 被解决(或任何异步操作),然后期望同步导出正确的值。

在这种情况下最合适的模式如下。

register-rmq.js

module.exports = main();

controller.js

var channel = require('./register-rmq');

channel.then(result => console.log(result));

【讨论】:

    猜你喜欢
    • 2012-09-03
    • 2015-11-21
    • 2017-05-15
    • 2020-07-24
    • 2016-08-16
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 2016-09-01
    相关资源
    最近更新 更多