我正在使用db.js与db相关的函数,我想调用db.js并等待它返回查询结果。 但是在执行db调用之后会返回结果。任何人都可以帮助解决这个问题。
代码示例:
var Q = require('q');
db= require("./dbaccess.js");
function waitfor(ms){
var deferred = Q.defer();
setTimeout(function() {
deferred.resolve(db);
}, 5000);
return deferred.promise;
}
waitfor(2000).done(function(dbcall) {
console.log('contrived example '+ dbcall.query1());
});
dbacess.js:
var sql = require('mssql');
var config = {
user: 'xx',
password: 'xxx',
server: 'aaa',
database: 'RequestCenter',
stream: true,
}
this.query1=function() {
sql.connect(config, function(err) {
var result;
var request = new sql.Request();
request.query("select * from dbo.AcAccount where Name like 'AutomationCli%' ");
request.on('row', function(row) {
console.log(row.Name);
result = row.Name;
});
request.on('error', function(err) {
console.log("err : "+err);
});
request.on('done', function(returnValue) {
console.log("done");
});
return result;
});
sql.on('error', function(err) {
console.log("sql err : "+err);
});
}
输出:
contrived example undefined
in db: AutomationClient
预期产出:
in db: AutomationClient
contrived example AutomationClient
答案 0 :(得分:0)
不确定为什么你的主代码在2000年传递ms
参数然后执行5000ms超时,实际上,为什么你要执行超时,如果那是一些等待db函数的尝试完成,然后你不需要它
如果你必须使用promises - 我个人会对这样简单的代码使用一个简单的回调,但是,我知道你想学习如何使用Promises
您的原始代码似乎是在尝试返回最后 row.name
此代码返回一个row.name
不知道你会得到的数据类型,我不知道哪个是正确的
dbacess.js
var Q = require('q');
var sql = require('mssql');
var config = {
user: 'xx',
password: 'xxx',
server: 'aaa',
database: 'RequestCenter',
stream: true,
}
this.query1 = function() {
var deferred = Q.defer();
sql.connect(config, function(err) {
var result = []; // return all rows - modify as required
var request = new sql.Request();
request.query("select * from dbo.AcAccount where Name like 'AutomationCli%' ");
request.on('row', function(row) {
console.log(row.Name);
result.push(row.Name);
});
request.on('error', function(err) {
console.log("err : " + err);
deferred.reject(err);
});
request.on('done', function(returnValue) {
deferred.resolve(result);
});
});
sql.on('error', function(err) {
console.log("sql err : " + err);
deferred.reject(err);
});
return deferred.promise;
}
代码示例:
db = require("./dbaccess.js");
db.query1().then(function(result) {
console.log('contrived example ' + result);
});