如何在javascript中使用defer/promise进行数据库调用
how to use defer/promise in javascript for a db call
我有一个带有数据库相关函数的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);
});
相关文章:
- 函数在promise被解析后被调用,但Jasmine未通过测试.为什么?
- AngularJS和promise值在调用本地函数时的效果-未定义
- 多次调用方法后返回相同promise的模式
- 我如何防止错误“;未捕获(在promise中)DOMException:play()请求被对pause()的调用中断&”
- 多次调用promise函数,直到另一个promise函数满足条件
- bluebird promise catch() 没有使用 Promise.CancelError 调用内部函数
- 使用 Promise 在另一个函数中调用带有 Bluebird 承诺库的函数
- JavaScript Promise 解析并拒绝函数调用序列
- 使用promise或setTimeout确定延迟函数的调用顺序
- 使用Node中的Q promise库对值数组顺序调用/执行相同的函数;并返回带有结果的新数组/集合
- Javascript Promise().然后防止在执行第一个调用之前重新调用该函数
- 当使用promise时,为什么最后一个会被调用
- 在 Promise 调用的错误函数回调后附加对象的用法是什么
- 使用 Javascript Promise 调用多个 WEB API 调用
- Typescript async/await Promise调用差异
- 为什么不't运行此promise调用之后的代码
- Javascript的Promise调用出现了Promise混淆
- 应该由Promise调用同步代码.然后创建一个新的Promise
- 如何组织递归promise调用
- window.open()在从promise调用时被浏览器阻止