【问题标题】:promise inside cron only executes oncecron 中的 promise 只执行一次
【发布时间】:2017-05-17 09:23:36
【问题描述】:

我真的被困在这里了。根据定义,Promise 只返回一次。但是,我需要想办法让 promise 与 cron 模块一起工作。以下是我正在尝试做的缩短版本。一切都在第一次执行得很好,但之后承诺永远不会解决。

不幸的是,我一直在使用 node-pool 模块,这是 promise 的来源。 HANA 数据库的连接池需要此模块。

谢谢!

var pool = require('generic-pool');
var servers = require('../config/servers');
var CronJob = require('cron').CronJob;
var hdb = require('hdb'); // database driver
var factories = {};
var pools = {};

for (let i = 0; i < servers.length; i++) {

    factories[servers[i].name] = {

        create: function(){
             return new Promise(function(resolve, reject){
                var client = hdb.createClient({
                    host: servers[i].host,
                    port: servers[i].port,
                    user: servers[i].user,
                    password: servers[i].password
                });

                resolve(client);

            });
        },
        destroy: function(client){
            if (!client.hadError && client.readyState !== 'closed') {
                client.end();
            }
        }

    };

    pools[servers[i].name] = pool.createPool(factories[servers[i].name]);

}


var job = new CronJob({

    cronTime: '0 * * * *',
    onTick: () => {

        async.waterfall([

            (callbackWF) => {

                var resourcePromise = pools[name].acquire();

                console.log(moment().format('YYYY-MM-DD HH:mm:ss.SS - ') + 'Attempting to resolve promise for Name: ' + name + ' Table: ' + table);

                resourcePromise.then( (client) => {

                    console.log(moment().format('YYYY-MM-DD HH:mm:ss.SS - ') + 'Got promise for Name: ' + name + ' Table: ' + table);

                    if (client.readyState != 'connected') {

                        client.connect( (err) => {

                            if (err) {

                                console.log(moment().format('YYYY-MM-DD HH:mm:ss.SS - ') + 'Error while connecting to client. Name: ' + name + ' Host: ' + host + ' Port: ' + port + ' User: ' + user + ' Error: ' + JSON.stringify(err));

                                return callbackWF('error', client);

                            } 

                            callbackWF(null, client);

                        });

                    } else {

                        callbackWF(null, client);

                    }

                }).catch( (err) => {

                    if (err) {

                        console.log(moment().format('YYYY-MM-DD HH:mm:ss.SS - ') + 'Error getting promise for connection pool. Name: ' + name + ' Host: ' + host + ' Port: ' + port + ' User: ' + user + ' Error: ' + JSON.stringify(err));
                        callbackWF('error');

                    }

                    console.log(moment().format('YYYY-MM-DD HH:mm:ss.SS - ') + 'Caught promise');

                });


            },

            // Get data for table.
            (client, callbackWF) => {

                client.exec(select, {rowsAsArray: true}, (err, rows) => {

                    if (err) {

                        console.log(moment().format('YYYY-MM-DD HH:mm:ss.SS - ') + 'Error while getting data from ' + name +  " table: " + table + ". " + err + select);
                        return callbackWF(err, client);

                    }

                    callbackWF(null, client);

                });

            }

        ], (err, client) => {

            if (typeof client != 'undefined') {

                console.log(moment().format('YYYY-MM-DD HH:mm:ss.SS - ') + 'Releasing pool for Name: ' + name + ' Table: ' + table);

                pools[name].release(client);

            }

        });

    },
    start: true,
    timeZone: 'UTC'
});

【问题讨论】:

  • "…after that the promise never resolves" 意味着这是一个新的承诺,因为第一次的承诺就已经很好地实现了。您向我们展示的代码没有任何问题,问题在acquire 内。请张贴。
  • 你确定你在某个地方给pool.release()打过电话吗?否则下一个acquire 永远不会解决是很合乎逻辑的
  • 在 'do stuff' 块中,它是一个 async.waterfall 函数。瀑布的“完成”是pools[name].release(client);我应该对池的状态进行更多调试吗?
  • 将async.waterfall 与promise 一起使用很可能是您的问题。是的,请尝试调试这个(至少确保问题真的不是release,只需在它旁边添加一个console.log并检查它是否运行),或者发布完整的代码,以便我们可以就它提出建议.
  • 代码更新!感谢观看

标签: javascript promise es6-promise


【解决方案1】:

我看不出这有什么问题。一个promise 可能只返回一次,但你完全可以调用then() 多次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-11
    • 2022-01-01
    • 2014-05-23
    • 2011-06-20
    • 2019-03-07
    • 2019-07-17
    • 1970-01-01
    • 2021-10-16
    相关资源
    最近更新 更多