1
私は本当にここにこだわっている。約束は、定義上、一度だけ返す。しかし、私はcronモジュールを使って約束をする方法を理解する必要があります。以下は私がしようとしているものの短縮バージョンです。すべてが最初はうまく実行されますが、その後は約束が解決されません。cronの中で約束するのは一度だけだよ
残念ながら私は約束がどこから来るのかというノードプールモジュールを使用して立ち往生しています。このモジュールは、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'
});
「*約束は決して解決しない*」とは、最初からのものがうまく成就して以来、新しい約束を意味する。あなたが私たちに示したコードには何も間違いはありません。問題は 'acquire'の中にあります。投稿してください。 – Bergi
あなたは 'pool.release()'をどこかで呼んでもよろしいですか?さもなければ、次の 'acquire'が' do stuff 'ブロック内の – Bergi
を決して決して決してしないということはかなり論理的です。そのasync.waterfall関数です。 waterfallの 'done'は 'pools [name] .release(client);'プールの状態を調べるためのデバッグがありますか? – ktravelet