0

この赤ちゃんの簡単なコードを考えてみましょう

pg.connect( {
    user: 'hhope',
    password: '...',
    port: 5432,
    host: '/var/run/postgresql',
    database: 'phiddler' },
  function( err, client ) {
    client.query(
      "select count(1) as ct from pg_prepared_statements",
      function( err, results ) {
        console.log( 'prepared statement count: '+results.rows[0].ct );
        client.query( {
                    name: 'test2' ,
                    text: "insert into t1( c2 ) values( 'q1')" },
          function( err, result ) {
            console.log( 'inserted t1' );
            client.query(
              "select count(1) as ct from pg_prepared_statements",
               function( err, results ) {
                  console.log( 'prepared statement count: '+results.rows[0].ct );
               } );
           }
        );
      }
    );
  }
);

手続き的に書かれた場合

pg = new PG(...);
client = new pg.client();
console.log( client.col( "select ..." ) );
client.prepare( 'test2', "insert into t1( c2 ) values( 'q1')" );
console.log( client.col( "select ..." ) );

私の考えでは、後者の方がはるかに読みやすく、保守しやすいです。

標準のインデントされたコールバックスタイルをより読みやすくするような妥協案はありますか?

4

3 に答える 3

2

asyncライブラリのwaterfallメカニズムを使用したい:

var async = require('async');

async.waterfall([
    pg.connect.bind(this, {
        user: 'user', password: 'pass', port: 5432, host: '/somewhere/', database: 'db'
    }),
    function(client, callback) {
        client.query('select * from foo', callback)
    }
], function(err, results) {
    console.log(results);
});

ES5のsにbind追加されたメソッドは、非同期ライブラリと組み合わせて非常に便利です。リストの最後の引数がコールバックであることが多く、チェーンに入る前に以前の値がわかっていることが多いためです。Function

于 2012-06-29T03:51:29.590 に答える
0

手続き型のバリアントは実際には同等ではありません-私はその同期を想定していますが、元のバリアントはおそらくそうではありません。

変数を閉じる必要がない場合は、名前付き関数を使用できます。何かのようなもの:

function f2(){}
function f1() {
    client.query("select count(1) as ct from pg_prepared_statements", f2);
}
pg.connect( {
    user: 'hhope',
    password: '...',
    port: 5432,
    host: '/var/run/postgresql',
    database: 'phiddler' },
    f1
);
于 2012-06-29T03:40:42.603 に答える
0

「読み取り可能」は意見の問題ですが、これを行うことができます。

var iter = function(cb) {
   var v = Array.prototype.slice.call(arguments);
   var f = function() {
        var g = v.shift();
        g && g(f);
   };

   f();
};

iter(function(cb) {
        console.log('in f1');
        cb();
     },
     function(cb) {
        console.log('in f2');
        cb();
     });
于 2012-06-29T03:59:49.893 に答える