2017-05-16 14 views
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' 
}); 
+0

「*約束は決して解決しない*」とは、最初からのものがうまく成就して以来、新しい約束を意味する。あなたが私たちに示したコードには何も間違いはありません。問題は 'acquire'の中にあります。投稿してください。 – Bergi

+0

あなたは 'pool.release()'をどこかで呼んでもよろしいですか?さもなければ、次の 'acquire'が' do stuff 'ブロック内の – Bergi

+0

を決して決して決してしないということはかなり論理的です。そのasync.waterfall関数です。 waterfallの 'done'は 'pools [name] .release(client);'プールの状態を調べるためのデバッグがありますか? – ktravelet

答えて

0

これは何も問題ありません。約束は一度しか返ってこないかもしれませんが、何度でも何度もthen()に電話することができます。