【问题标题】:console.log not fired when promise is executed执行 promise 时不会触发 console.log
【发布时间】:2019-05-06 20:00:07
【问题描述】:

我有一个 js 文件,我在其中导出了一个承诺,然后在另一个文件中调用它。 我不明白为什么当我调用承诺时控制台日志没有被触发, 也许我没有完全理解承诺是如何运作的,或者我称之为承诺的方式有问题

pub.js

var config = require('../config');
var q = 'tasks';
var open = require('amqplib').connect('amqp://'+ config.rabbitmq.url);

module.exports =  open.then(function(conn) {
  return conn.createChannel();
}).then(function(ch) {
  return ch.assertQueue(q).then(function(ok) {
   console.log('inside publisher')
   const r = ch.sendToQueue(q, Buffer.from('something to do'));
   console.log('r',r)
     return r
  });
}).catch(console.warn);

index.js(我称之为 promise)

var express = require('express');
var router = express.Router();
var publisher = require('../connectors/pub');

var rabbitPromise = () => (
    new Promise((resolve,reject)=>{
        publisher
                .then(res=>{
                        console.log('-----------------------')
                        console.log('publishing now',res)
                        resolve(res)

                })
    })  

);
/* GET home page. */
router.get('/', async(req, res, next) => {
    const result_pub = await rabbitPromise()  
    res.send('ok')
});


我希望看到 console.log('inside publisher') 但我没有看到它我只得到 console.log('----------------- -----') 和 console.log('publishing now',res),

【问题讨论】:

  • 注意 .then 应该在 Promise 对象上调用。出版商的角色是什么?
  • @jank 发布者向 rabbitmq 发布一条消息并返回 true
  • Promise 不是惰性的,一个链会立即执行,因此一旦队列被断言,“内部发布者”消息就会被记录。您确定确实建立了连接吗?可能需要一段时间。

标签: node.js es6-promise


【解决方案1】:

pub.js 中的链接不正确。为了调用承诺,它会更像这样:

module.exports =  open
   .then(function(conn) {
     return conn.createChannel();
   })
   .then(function(ch) {
     return ch.assertQueue(q);
   })
   .then(function(ok) {
      console.log('inside publisher')
      const r = ch.sendToQueue(q, Buffer.from('something to do'));
      console.log('r',r)
      return r
   })
   .catch(console.warn);

【讨论】:

  • 此代码有问题:'ch' 未在 const r = ch.sendToQueue(q, Buffer.from('something to do')); 中定义;
  • 确实,你的第一个实现很好,我怀疑 assertQueue(q) 错误没有被捕获,也许你可以在你的代码中尝试ch.assertQueue(q).then(...).catch(r=> throw new Error(r)) 看看你是否有控制台警告?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 2017-06-08
  • 1970-01-01
  • 1970-01-01
  • 2020-05-23
  • 2015-07-08
  • 1970-01-01
相关资源
最近更新 更多