2015-11-30 43 views
-1

我有与db相关的函数db.js,我想调用db.js并等待,直到它返回查询结果。 但是执行db调用后返回结果。任何人都可以请帮助如何解决这个问题。如何在JavaScript中使用延迟/承诺数据库调用

代码示例:

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

db.query1()返回什么? –

+0

请包括'dbaccess.js'代码 – timothyclifford

+0

增加了dbaccess.js代码 – user2677647

回答

0

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

如果必须使用的承诺 - 我个人会使用一个简单的回调对于这样简单的代码,但是,我得到的是你要学习如何使用承诺

你的原代码看起来像它试图返回的值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); 
}); 
+0

非常感谢。我有另一种场景,我需要打开网页中的对话框,并检查状态是否每1分钟完成,直到30分钟。你能否给我建议如何循环承诺/推迟。 – user2677647