如何在javascript中使用defer / promise进行db调用

时间:2015-11-30 08:06:24

标签: javascript promise q deferred

我正在使用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

1 个答案:

答案 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);
});