Ho cercato di capire come utilizzare le fibre del nodo per rendere il mio codice di database meno disordinato in node.js, ma non riesco a farlo funzionare. Ho bollito il codice fino a questo come un banco di prova minima:fibre node.js con pg/postgres
var Future = require('fibers/future');
var pg=require('pg');
var connstr = "pg://not_the_real_user:[email protected]/db";
var pconnect = Future.wrap(pg.connect);
Fiber(function() {
var client = pconnect(connstr).wait();
console.log("called function");
}).run();
Se lascio così com'è, ottengo il seguente errore:
pgfuture.js:10
}).run();
^
TypeError: undefined is not a function
at Object.PG.connect.pools.(anonymous function).genericPool.Pool.create (/home/erik/code/treehouse-node/node_modules/pg/lib/index.js:49:20)
at dispense (/home/erik/code/treehouse-node/node_modules/pg/node_modules/generic-pool/lib/generic-pool.js:223:17)
at Object.exports.Pool.me.acquire (/home/erik/code/treehouse-node/node_modules/pg/node_modules/generic-pool/lib/generic-pool.js:267:5)
at PG.connect (/home/erik/code/treehouse-node/node_modules/pg/lib/index.js:75:15)
at Future.wrap (/home/erik/code/treehouse-node/node_modules/fibers/future.js:30:6)
at /home/erik/code/treehouse-node/pgfuture.js:8:18
Tuttavia, se io commento la riga che chiama pconnect, ottengo il messaggio "function function" sulla console e nessun errore. L'esempio sulla pagina Github ha una struttura quasi identica, e funziona correttamente sul mio sistema, ma sono perplesso su cosa sto facendo male qui.
Edit: Osservazioni
Sono riuscito a ottenere il codice da eseguire dopo una moda in due modi diversi che sembrano estranei, ma entrambi hanno lo stesso comportamento. Al termine della funzione, il nodo si blocca e devo ucciderlo con ctrl-c. Qui ci sono le due cose che ho fatto per ottenere quel risultato:
1) Avvolgere pg.connect in una funzione anonima, e poi avvolgere CHE con Future:
pconnect = Future.wrap(function(err,cb){pg.connect(err,cb);});
2) Questo è un vero e proprio mistero, ma sembra avere lo stesso risultato. All'interno della fibra, ho chiamato direttamente pg.connect prima della chiamata a pconnect, e tutto sembra funzionare.
// add this line before call to pconnect
pg.connect(connstr, function(e,c){console.log("connected.");});
// and now the original call to pconnect
var client = pconnect(connstr).wait();
posso immaginare una circostanza in cui (1) avrebbe senso se, ad esempio, la funzione pg.connect ha altri argomenti opzionali che sono in qualche modo interferire con il layout previsto della chiamata Future.wrap. Un'altra possibilità è che un oggetto sta andando fuori dal campo di applicazione e il riferimento "questo" non è definito quando viene effettuata la chiamata effettiva a pconnect. Non riesco a capire perché (2) abbia qualche effetto.
Edit: risposta parziale
Va bene, così ho risposto almeno una parte della questione. Il pensiero avevo sull'ambito oggetto rivelato essere corretti, e utilizzando la funzione bind() ho potuto eliminare lo strato supplementare di callback incarto:
var pconnect = Future.wrap(pg.connect.bind(pg));
E ancora appeso al termine dell'esecuzione di motivi sconosciuti però.