[英]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.