在下面的代码中,当我使用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");});
答案 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
基本上nfcall
,nfapply
,npost
,ninvoke
函数用于通过调用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
所做的。