【发布时间】: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