如何在javascript中使用defer/promise进行数据库调用

how to use defer/promise in javascript for a db call

本文关键字:promise 调用 数据库 defer javascript      更新时间:2023-09-26

我有一个带有数据库相关函数的db.js,我想调用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

不知道为什么你的主代码在2000年通过ms参数,然后进行5000ms的超时,事实上,你为什么要进行超时,如果那是为了等待db函数完成,那么你不需要它

如果您必须使用promises-就我个人而言,我会对这样简单的代码使用简单的回调,但是,我知道您想学习如何使用promises

您的原始代码看起来像是试图返回LASTrow.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);
});