Q.js承诺与节点。 缺less`socket`上的error handling程序。 TypeError:不能调用未定义的方法

我用nodejs和承诺的新手,我用npm安装Q.js

 npm install q 

我试着哟做一个承诺,当我查询postgres,这是我的代码…

 socket.on('Operation', function (data) { ....... getElementInPostgres(makeQuery) .then(function (name) { console.log("promiseeee then"); .......blablabla }) .fail(function (err) { console.log("promiseeee error"); }); ............. function getElementInPostgres(makeQuery){ console.log("entro getElementInPostgres"); var deferred = Q.defer(); client.query( makeQuery, function(err, result) { if (err) { console.log("NO getElementInPostgres"); console.log(err); deferred.reject(err); } else { console.log("ok getElementInPostgres"); console.log(result); deferred.resolve(result); } return deferred.promise; }); } 

但是我的代码崩溃了

 entro getElementInPostgres Missing error handler on `socket`. TypeError: Cannot call method 'then' of undefined at Socket.<anonymous> (/var/www/test.smartparking/nodejs/server.js:247:6) at Socket.EventEmitter.emit (events.js:95:17) at Socket.onevent (/var/www/test.smartparking/nodejs/node_modules/socket.io/lib/socket.js:335:8) at Socket.onpacket (/var/www/test.smartparking/nodejs/node_modules/socket.io/lib/socket.js:295:12) at Client.ondecoded (/var/www/test.smartparking/nodejs/node_modules/socket.io/lib/client.js:193:14) at Decoder.Emitter.emit (/var/www/test.smartparking/nodejs/node_modules/socket.io/node_modules/socket.io-parser/node_modules/component-emitter/index.js:134:20) at Decoder.add (/var/www/test.smartparking/nodejs/node_modules/socket.io/node_modules/socket.io-parser/index.js:247:12) at Client.ondata (/var/www/test.smartparking/nodejs/node_modules/socket.io/lib/client.js:175:18) at Socket.EventEmitter.emit (events.js:95:17) at Socket.onPacket (/var/www/test.smartparking/nodejs/node_modules/socket.io/node_modules/engine.io/lib/socket.js:101:14) 

我正在看例子,并没有看到任何不同的代码…

谢谢 !

请参阅q.defer例子 ,请尝试移动return deferred.promise; 出于client.query如下

 function getElementInPostgres(makeQuery){ console.log("entro getElementInPostgres"); var deferred = Q.defer(); client.query( makeQuery, function(err, result) { if (err) { console.log("NO getElementInPostgres"); console.log(err); deferred.reject(err); } else { console.log("ok getElementInPostgres"); console.log(result); deferred.resolve(result); } }); return deferred.promise; } 

你只需要在client.query之外返回promise。

 function getElementInPostgres(makeQuery){ console.log("entro getElementInPostgres"); var deferred = Q.defer(); client.query(makeQuery, function(err, result) { if (err) { console.log("NO getElementInPostgres"); console.log(err); deferred.reject(err); } else { console.log("ok getElementInPostgres"); console.log(result); deferred.resolve(result); } }); return deferred.promise; } 

client.query是一个asynchronous方法….所以当你打电话

 getElementInProgress(makeQuery).then(...); 

.then()将在client.query返回之前调用。