【问题标题】:how to use defer/promise in javascript for a db call如何在 javascript 中使用 defer/promise 进行数据库调用
【发布时间】:2016-03-03 19:33:39
【问题描述】:

我有带有 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()); 

});

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

【问题讨论】:

标签: javascript promise q deferred


【解决方案1】:

不知道为什么你的主代码在 2000 年为 ms 参数传递,然后做了 5000 毫秒超时,事实上,如果那是为了等待 db 函数完成的一些尝试,你为什么要做一个超时,那你就不需要了

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

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

【讨论】:

  • 非常感谢。我有另一种情况,我需要在网页中打开一个对话框,并每隔 1 分钟检查一次状态是否已完成,直到 30 分钟。你能给我一些关于如何循环承诺/延迟的建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-25
  • 1970-01-01
  • 2016-01-27
  • 1970-01-01
  • 2021-10-22
相关资源
最近更新 更多