调用节点函数(返回一个promise)与使用ninvoke直接相比有什么区别

时间:2014-05-26 16:41:29

标签: node.js promise q

在下面的代码中,当我使用ninvoke调用时,“then”部分不会被执行。结果如下

通过使用ninvoke的函数调用 dbConnect - >成功:连接到db!

直接打电话 dbConnect - >成功:连接到db! 2222222 - 直接调用后

为什么?

"use strict";

var theQ = require("q");
var pg = require('pg');
var dbUri = "postgres://postgres:user123@localhost:5432/postgres"; //postgres uri
var client1 = new pg.Client(dbUri);
var client2 = new pg.Client(dbUri);

function dbConnect(dbClient, tag) {
    //var myName = arguments.callee.toString().match(/function ([^\(]+)/)[1];
    var deferred = theQ.defer();
    dbClient.connect(function(err, result) {
        if (err) {
            console.error("\n" + tag + "\ndbConnect --> Failure: could not connect to db!!!!");
            deferred.reject();
        }
        else {
            console.log("\n" + tag + "\ndbConnect --> Success: Connected to db!");
            //results[]
            deferred.resolve();
        }
    });
    return deferred.promise;
}

function myTestDB(dbClient, tag) {
    return theQ
        .ninvoke(dbConnect(dbClient, tag))
        .then(function() {console.log("333333 - Called after ninvoke");});
}

//main line
myTestDB(client1, "calling thru a function that uses ninvoke");
dbConnect(client2, "calling directly").then(function() {console.log("2222222 - After Called Directly");});

2 个答案:

答案 0 :(得分:2)

手动宣传的生命太短暂

"use strict";
var Promise = require("bluebird");
var pg = require('pg');
Promise.promisifyAll(pg.Client.prototype);
var dbUri = "postgres://postgres:user123@localhost:5432/postgres"; //postgres uri
var client1 = new pg.Client(dbUri);
var client2 = new pg.Client(dbUri);



client1.connectAsync()
    .then(function() {
        console.log("connected to bg, begin query");
        return client1.queryAsync("SELECT * FROM example")
    })
    .then(function(result) {
        console.log("query complete, first row: " + JSON.stringify(result.rows[0]));
    })
    .error(function(e) {
        console.error("failed to connect");
    });

答案 1 :(得分:0)

首先,您首先调用dbConnect,然后使用ninvoke调用结果。这是错误的。

我认为您需要再次阅读q的这一部分:http://documentup.com/kriskowal/q/#tutorial/adapting-node

基本上nfcallnfapplynpostninvoke函数用于通过调用nodejs回调样式函数来创建承诺。在你的情况下,函数dbConnect不是跟随node.js回调,而是返回一个promise。

dbClient.connect遵循node.js回调样式。你可以使用nfinvoke来调用它并像这样得到一个承诺:

Q.ninvoke(dbClient, 'connect')
  .then(function() {console.log("We used ninvoke");})
  .catch(function (err) { console.log('we got the error!') });

上面将调用dbClient的connect方法并返回一个promise,它几乎等于dbConnect所做的。