有没有办法让javascript中的嵌套回调代码更具可读性?
考虑一下这段简单的代码有没有办法让javascript中的嵌套回调代码更具可读性?,javascript,node.js,syntax,callback,Javascript,Node.js,Syntax,Callback,考虑一下这段简单的代码 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",
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 ..." ) );
在我看来,后者更具可读性和可维护性
是否有某种折衷的方法可以使标准缩进回调样式更具可读性?过程变量并不是真正等效的-我假设它是同步的,而原始的可能不是 如果不需要关闭变量,可以使用命名函数。比如:
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
);
您要使用库的机制:
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中添加到函数
中的bind
方法与异步库结合使用非常有用,因为列表中的最后一个参数通常是回调,并且在进入链之前通常知道早期的值。“可读”是一个意见问题,但您可以这样做:
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();
});
属于on:方法将
客户机
对象传递到它的回调中,这样写就不起作用了。同意它们不是等价的,后者是同步的(如您所说)。没有放入变量赋值,因为不希望人们处理是否可以在一个或两个客户端调用中完成,以及语法本身。同意,可以说出funcs的名字,但我不知道两个恶魔。