繁体   English   中英

Q.js承诺与节点。 套接字上缺少错误处理程序。 TypeError:无法调用未定义的方法“ then”

[英]Q.js promise with node. Missing error handler on `socket`. TypeError: Cannot call method 'then' of undefined

我是使用Node.js和Promise的新手,我使用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是一个异步方法....所以当您调用

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM