繁体   English   中英

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

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

我有带有 db 相关函数的 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()); 

});

数据库访问.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

不知道为什么您的主要代码为ms参数传入 2000 年,然后超时 5000 ms ,事实上,您为什么要超时,如果这是等待 db 函数完成的某种尝试,那么您不会不需要

如果你必须使用承诺——我个人会为这样简单的代码使用一个简单的回调,但是,我知道你想学习如何使用承诺

您的原始代码看起来像是试图返回LAST row.name的值

此代码返回一个row.name数组

不知道您将获得的数据类型,我不知道哪个是正确的

数据库

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM